首页 > 解决方案 > 如何正确地从文本中获取不会引发 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 不允许发布此类链接。

标签: pythontwitterpython-requests

解决方案


您可以使用美丽的汤从源代码和验证器模块中提取所有链接,以验证 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 字符串(列表)。然后过滤器将删除所有无效的网址。


推荐阅读