python urllib2.urlopen - html文本乱码 - 为什么?
打印出来的html显示的是乱码……而不是我在浏览器的“查看源代码”中看到的内容。
这是为什么呢?有什么简单的方法可以解决这个问题吗?
谢谢你的帮助。
使用mechanize、curl等工具时也出现了同样的问题。
import urllib
import urllib2
start_url = "http://www.ncert.nic.in/ncerts/textbook/textbook.htm"
response = urllib2.urlopen(start_url)
html = response.read()
print html
2 个回答
3
试试使用 requests。Python Requests.
import requests
response = requests.get("http://www.ncert.nic.in/ncerts/textbook/textbook.htm")
print response.text
这样做的原因是因为这个网站使用了 gzip 编码。根据我的了解,urllib 不支持解压缩,所以你会得到一些使用这种编码的网站返回的压缩的 HTML 内容。你可以通过打印响应中的内容头来确认这一点,像这样。
print response.headers
在这里你会看到 "Content-Encoding" 是 gzip 格式。为了在使用标准的 urllib 库时绕过这个问题,你需要使用 gzip 模块。Mechanize 也是这样做的,因为它使用的是同样的 urllib 库。而 requests 会处理这种编码,并且会把内容格式化得很好。
3
我用curl也遇到了同样的乱码。
curl http://www.ncert.nic.in/ncerts/textbook/textbook.htm
结果看起来是经过gzip压缩的。所以这对我来说显示了正确的HTML。
curl http://www.ncert.nic.in/ncerts/textbook/textbook.htm | gunzip
这里有一个在Python中处理这个问题的解决方案:将通过urllib2获取的gzip压缩数据转换为HTML
由提问者编辑:
在阅读了上面的内容后,修订的答案是:
import urllib
import urllib2
import gzip
import StringIO
start_url = "http://www.ncert.nic.in/ncerts/textbook/textbook.htm"
response = urllib2.urlopen(start_url)
html = response.read()
data = StringIO.StringIO(html)
gzipper = gzip.GzipFile(fileobj=data)
html = gzipper.read()
html
现在保存了HTML内容(打印出来看看)