4

我正在尝试用beautifulsoup4 和python3抓取一个非常长的网页。由于网站的大小,http.client当我尝试在网站中搜索某些内容时会引发错误:

文件“/anaconda3/lib/python3.6/http/client.py”,第 456 行,读取返回 self._readall_chunked() 文件“/anaconda3/lib/python3.6/http/client.py”,第 570 行,在 _readall_chunked raise IncompleteRead(b''.join(value)) http.client.IncompleteRead: IncompleteRead(16109 bytes read)

有没有办法解决这个错误?

4

1 回答 1

2

正如顶部的文档http.client告诉您的那样,这是一个非常低级的库,主要用于支持urllib,并且:

另见Requests 包被推荐用于更高级别的 HTTP 客户端接口。

如果可以conda install requestspip install requests,您的问题将变得微不足道:

import requests
req = requests.get('https://www.worldcubeassociation.org/results/events.php?eventId=222&regionId=&years=&show=All%2BPersons&average=Average')
soup = BeautifulSoup(req.text, 'lxml')

如果您无法安装第三方库,则可以解决此问题,但实际上并不支持,也不容易。中的块处理代码http.client都不是公开的或记录在案的,但文档确实将您链接到源代码,您可以在其中看到私有方法。特别是,请注意read调用名为 的方法_readall_chunked,该方法会循环调用_safe_readon 的方法_get_chunk_left。该_safe_read方法是您需要替换的代码(例如,通过子类HTTPResponse化或猴子补丁)来解决此问题。这可能不会像使用更高级别的库那样简单或有趣。

于 2018-07-07T20:59:12.553 回答