【问题标题】:python requests invalid schema errorpython请求无效模式错误
【发布时间】:2016-04-23 23:18:16
【问题描述】:

我正在尝试从在线文本语料库中抓取。这些文本在网站上以树状排列:单击 A 打开 B 页面,在 B 中单击 C 打开文本。在 A 中大约有 ~50 个链接,在 B 中,它在 3 到 ~150 之间变化,C 中有时也有链接,但我对它们不感兴趣。
这是我为实现这一目标所做的:我打开 A,用 BeautifulSoup 解析它,收集我想要的链接,并将其保存为 .txt 文件。然后我做了以下事情:

Url_List=[]

with open("Aramaic_Url_List.txt", "r") as Url_List:
    urls=Url_List.read()

A_url_list=urls.splitlines()  
Yeni_A_url_list=[showsubtexts for showsubtexts in A_url_list if len(showsubtexts)>52]  

它以列表形式为我提供了我想要的页面 A 中的所有链接。 然后我写了一个小脚本来测试是否可以从列表Yeni_A_url_list的一个元素中获取B页中的链接,这是我的脚本:

data2=requests.get(Yeni_A_url_list[1].strip())
data2.raise_for_status()
data2_Metin=data2.text

soup_data2=BeautifulSoup(data2_Metin, "lxml")

for link in soup_data2.find_all("a"):
    print(link.get("href"))

条带可能在那里没有任何功能,但我认为它不会受到伤害。该脚本对于一个元素来说效果很好。所以我想,是时候写一个函数来为页面A中的每个链接获取页面B级别的所有链接了。所以这是我的函数:

def ListedenLinkAl(h):
    if h in Yeni_A_url_list:
        print(h)
    g=requests.get(h)
    g.raise_for_status()
    data_mtn=g.text
    data_soup=BeautifulSoup(data_mtn,"lxml")
    oP=[b.get("href") for b in data_soup.find_all("a")]
    tk=list(set(oP))
    sleep(3)  
    return tk

print 在那里我可以看到该函数已经制定的链接,并且 sleep 在那里不会对服务器过度收费,尽管由于某种原因 time.sleep 显示语法错误。该函数也适用于列表的单个元素,这意味着以下工作:ListedenLinkAl(Yeni_A_url_list[1])

所以我想,是时候将这个函数应用于列表Yeni_A_url_list 的每个元素并进行列表理解了:

Temiz_url_Listesi=[ListedenLinkAl(x) for x in Yeni_A_url_list]

我收到以下错误:

In [45]: Temiz_url_Listesi=[ListedenLinkAl(x) for x in Yeni_A_url_list]
http://cal1.cn.huc.edu/showsubtexts.php?keyword=21200
Traceback (most recent call last):

  File "<ipython-input-45-8e4811c83c3f>", line 1, in <module>
    Temiz_url_Listesi=[ListedenLinkAl(x) for x in Yeni_A_url_list]

  File "<ipython-input-45-8e4811c83c3f>", line 1, in <listcomp>
    Temiz_url_Listesi=[ListedenLinkAl(x) for x in Yeni_A_url_list]

  File "<ipython-input-36-390e6ed1eae5>", line 6, in ListedenLinkAl
    g=requests.get(h)

  File "/home/dk/anaconda3/lib/python3.5/site-packages/requests/api.py", line 67, in get
    return request('get', url, params=params, **kwargs)

  File "/home/dk/anaconda3/lib/python3.5/site-packages/requests/api.py", line 53, in request
    return session.request(method=method, url=url, **kwargs)

  File "/home/dk/anaconda3/lib/python3.5/site-packages/requests/sessions.py", line 468, in request
    resp = self.send(prep, **send_kwargs)

  File "/home/dk/anaconda3/lib/python3.5/site-packages/requests/sessions.py", line 570, in send
    adapter = self.get_adapter(url=request.url)

  File "/home/dk/anaconda3/lib/python3.5/site-packages/requests/sessions.py", line 644, in get_adapter
    raise InvalidSchema("No connection adapters were found for '%s'" % url)

InvalidSchema: No connection adapters were found for 'http://cal1.cn.huc.edu/showsubtexts.php?keyword=21200'

In [46]: 

我不知道为什么该函数适用于列表中的单个元素,但不适用于列表理解。

【问题讨论】:

    标签: python-3.x web-scraping python-requests list-comprehension


    【解决方案1】:

    好像url周围有多余的字符,用str.strip()清理一下:

    g = requests.get(h.strip())
    

    【讨论】:

    • 你猜对了,第一个 url 周围有一个额外的字符,但是 str.strip() 并没有解决我的问题,而是我跳过了 list-comprehension 中的第一个 url,并开始从第二个网址列出。看来我的功能现在正在运行。
    猜你喜欢
    • 2014-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-14
    • 2021-03-16
    • 1970-01-01
    • 2015-01-19
    • 2019-05-10
    相关资源
    最近更新 更多