python urllib2.urlopen - html文本乱码 - 为什么?

1 投票
2 回答
698 浏览
提问于 2025-04-18 08:25

打印出来的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内容(打印出来看看)

撰写回答