我创建了一个从特定网址读取HTML内容的函数。这是代码:
def __retrieve_html(self, address):
html = urllib.request.urlopen(address).read()
Helper.log('HTML length', len(html))
Helper.log('HTML content', html)
return str(html)
但是该函数并不总是返回正确的字符串。在某些情况下,它会返回一个非常长的奇怪字符串。
例如,如果我使用URL:http://www.merdeka.com
,有时会提供正确的html字符串,但有时也会返回如下结果:
HTML content: b'\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03\xed\xfdyW\x1c\xb7\xd28\x8e\xffm\x9f\x93\xf7\xa0;y>\xc1\xbeA\xcc\xc2b\x03\x86\x1cl\xb0\x8d1\x86\x038yr\......Very long and much more characters.
似乎只会在包含大量内容的任何网页中发生。对于像Facebook.com登录页面和Google.com索引这样的简单页面,它从未发生过。这是什么?我的错误在哪里以及如何处理?
答案 0 :(得分:1)
你有字节而不是字符串,因为urrlib无法为你解码响应。这可能是因为某些网站在其内容类型标题中省略了编码声明。
例如,google.com有:
Content-Type:text / html;字符集= UTF-8
那个http://www.merdeka.com网站只有:
内容类型:text / html
因此,您需要手动解码响应,例如使用utf-8编码
html = urllib.request.urlopen(address).read().decode('utf-8')
问题是你需要设置正确的编码,如果它不在服务器头中,你需要以某种方式猜测它。
有关详情,请参阅此问题How to handle response encoding from urllib.request.urlopen()
PS:考虑从有些弃用的urllib
移动到requests
lib。它在这个时候更简单,更时尚,更性感:)
答案 1 :(得分:1)
来自1 Normal Form
的响应似乎是经过压缩压缩的。
尝试一下:
import gzip
import urllib.request
def __retrieve_html(self, address):
with urllib.request.urlopen(address) as resp:
html = resp.read()
Helper.log('HTML length', len(html))
Helper.log('HTML content', html)
if resp.info().get('Content-Encoding') == 'gzip':
html = gzip.decompress(html)
return html
如何解码您的html
对象,我将此作为练习留给您。
或者,您可以使用“请求”模块:http://www.merdeka.com
使用以下命令安装:
pip install requests
然后执行:
import requests
r = requests.get('http://www.merdeka.com')
r.text
的回复似乎没有任何问题