Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 无法使用AIOHTTPClientSession获取网页_Python_Python Asyncio - Fatal编程技术网

Python 无法使用AIOHTTPClientSession获取网页

Python 无法使用AIOHTTPClientSession获取网页,python,python-asyncio,Python,Python Asyncio,我想使用asyncio来获取网页 但是,当我执行下面的代码时,没有获得任何页面 代码是 导入aiofiles 进口aiohttp 从aiohttp导入客户端会话 导入异步 异步def get_网页(url、会话): 尝试: res=wait session.request(method=“GET”,url=url) html=await res.text(encoding='GB18030') 返回0,html 除: 返回1,[] 异步def main_get_网页(URL): 网页=[] 连接

我想使用asyncio来获取网页

但是,当我执行下面的代码时,没有获得任何页面

代码是

导入aiofiles
进口aiohttp
从aiohttp导入客户端会话
导入异步
异步def get_网页(url、会话):
尝试:
res=wait session.request(method=“GET”,url=url)
html=await res.text(encoding='GB18030')
返回0,html
除:
返回1,[]
异步def main_get_网页(URL):
网页=[]
连接器=aiohttp.TCP连接器(限值=60)
与ClientSession(连接器=连接器)作为会话异步:
任务=[获取url中url的网页(url,会话)]
结果=等待asyncio.gather(*任务)
对于状态,结果中的数据:
打印(状态)
如果状态==0:
网页.附加(数据)
返回网页
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
URL=['https://lcdsj.fang.com/house/3120178164/fangjia.htm', 'https://mingliugaoerfuzhuangyuan0551.fang.com/house/2128242324/fangjia.htm']
loop=asyncio.proactReventLoop()
asyncio.set\u event\u循环(循环)
loop=asyncio.get\u event\u loop()
webpage=loop.run_直到_完成(main_get_网页(URL))
我希望函数
main\u get\u网页(URL)
中会打印两个零

然而,有两个是印刷的

我的代码怎么了

如何解决这个问题

多谢各位

我的代码怎么了

问题是您有一个
try:。。。除了:
,它掩盖了问题的根源。如果删除
except
子句,您将发现一条错误消息,该消息传达了根本问题:

UnicodeDecodeError: 'gb18030' codec can't decode byte 0xb7 in position 47676: illegal multibyte sequence
该网页未编码为GB18030。该页面声明自己为GB2312(GB18030的前游标),但将其用作编码也失败了

如何解决这个问题

根据您想对网页文本执行的操作,您有几个选项:

  • 查找Python支持的用于给定页面的编码。这是一个理想的选择,但我无法通过短搜索找到它。(使用查找chrome认为页面使用的内容也没有帮助,因为响应是
    GBK
    ,这会在字符47676上产生错误。)

  • 使用更宽松的错误处理程序解码页面,例如
    res.text(encoding='GB18030',errors='replace')
    。这将为您提供一个很好的文本近似值,其中不可解析的字节将作为文本呈现。如果您需要在页面中搜索子字符串或将其作为文本进行分析,并且不关心其中某个奇怪的字符,那么这是一个很好的选择

  • 放弃将页面解码为文本的想法,只需使用
    res.data()
    获取字节。如果您需要存档或缓存页面,或为其编制索引,则此选项是最佳选择

  • 我的代码怎么了

    问题是您有一个
    try:。。。除了:
    ,它掩盖了问题的根源。如果删除
    except
    子句,您将发现一条错误消息,该消息传达了根本问题:

    UnicodeDecodeError: 'gb18030' codec can't decode byte 0xb7 in position 47676: illegal multibyte sequence
    
    该网页未编码为GB18030。该页面声明自己为GB2312(GB18030的前游标),但将其用作编码也失败了

    如何解决这个问题

    根据您想对网页文本执行的操作,您有几个选项:

  • 查找Python支持的用于给定页面的编码。这是一个理想的选择,但我无法通过短搜索找到它。(使用查找chrome认为页面使用的内容也没有帮助,因为响应是
    GBK
    ,这会在字符47676上产生错误。)

  • 使用更宽松的错误处理程序解码页面,例如
    res.text(encoding='GB18030',errors='replace')
    。这将为您提供一个很好的文本近似值,其中不可解析的字节将作为文本呈现。如果您需要在页面中搜索子字符串或将其作为文本进行分析,并且不关心其中某个奇怪的字符,那么这是一个很好的选择

  • 放弃将页面解码为文本的想法,只需使用
    res.data()
    获取字节。如果您需要存档或缓存页面,或为其编制索引,则此选项是最佳选择


  • 谢谢你的帮助。我不能得到正确的编码,我需要的内容。所以我采取解决方案2,没问题。还有
    错误='ignore'
    ,这将完全删除有问题的序列。感谢您的帮助。我不能得到正确的编码,我需要的内容。所以我采取解决方案2,没问题。还有
    errors='ignore'
    ,这将完全删除有问题的序列。