python - 如何正确地从文本中获取不会引发 InvalidSchema("No connection adapters were found for {!r}".format(url)) 错误的 URL?
问题描述
我使用以下代码从存储在 DataFrame 中的推文中获取链接
column = ['tweet_text']
df = pd.read_csv('file.csv', names = column, header = None)
df["tweet_text"]=df["tweet_text"].astype(str)
pattern = r'(https?:\/\/(?:www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}[-a-zA-Z0-9()@:%_+.~#?&/=]*)'
df['links']= df["tweet_text"].str.extract(pattern, expand=True)
df.dropna(inplace=True)
我正在使用以下代码从 twitter 提供的缩短链接和每个链接的页面内容中提取实际链接
url_list = list(df['links'])
actual_list =[]
HTML_content = []
import requests
for link in url_list:
response = requests.get(str(link.encode("ascii")))
actual_url = response.text
response = requests.get(str(actual_url.encode("ascii")))
actual_list.append(actual_url)
HTML_content.append(response.content)
df["actual_url"] = actual_list
df["HTML"] = HTML_content
直到昨天,这段代码还在做它打算做的事情。但是当我今天刮掉其他推文并试图获取它提供的信息时
---------------------------------------------------------------------------
InvalidSchema Traceback (most recent call last)
<ipython-input-33-fc52700ad1a7> in <module>()
6 session.trust_env = False
7 for link in url_list:
----> 8 response = requests.get(str(link.encode("ascii")))
9 actual_url = response.text
10 response = requests.get(str(actual_url.encode("ascii")))
4 frames
/usr/local/lib/python3.6/dist-packages/requests/sessions.py in get_adapter(self, url)
726
727 # Nothing matches :-/
--> 728 raise InvalidSchema("No connection adapters were found for {!r}".format(url))
729
730 def close(self):
InvalidSchema: No connection adapters were found for "b'https : // t. co / emPZ7VNT4E'"
现在我知道问题出在链接上,错误消息显示它的双引号和b
. 由于这个问题的大多数其他解决方案都告诉删除额外的字符,但我已经检查了链接,没有这样的额外字符(或者至少这df['links']
是显示的),其次我需要每天执行此操作,这意味着我不会每天都能解决这个问题。有人可以告诉我如何解决这个问题吗?
PS:我在缩短的链接中添加了空格,因为 stackoverflow 不允许发布此类链接。
解决方案
您可以使用美丽的汤从源代码和验证器模块中提取所有链接,以验证 url 是否有效。
from bs4 import BeautifulSoup
import validators, requests
r = requests.get(source_url)
b = BeautifulSoup(r.text)
valid_urls = list(filter(validators.url, map(lambda x: x.get('href',''), b.findAll('a'))))
BeautifulSoup 提供了所有锚标签的 bs4.element.tags,从那里我们将每个标签映射到 href 字符串(列表)。然后过滤器将删除所有无效的网址。
推荐阅读
- python-3.x - 在烧瓶的单视图函数中删除两个关系表值
- sql - 如何在 Microsoft SQL Server Management Studio 2014 中更新表
- svn - 从旧版本的主干分支出来并合并回主干的 HEAD
- boost - MIPS 平台的交叉编译 Boost
- node.js - WriteStream.emit 错误:我在这段代码中做错了什么
- html - Vue-select 下拉菜单无法正常工作
- xamarin - 如何更新sqlite中对应于id的表
- javascript - 如何将日期时间形式 Net 转换为 JavaScript
- tomcat - Logstash tomcat 堆栈跟踪解析失败
- google-cloud-functions - Google Cloud Function 错误“OperationError:code=3,message=Function failed on loading user code”