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

时间:2014-06-03 15:07:07

标签: python html urllib2 mechanize-python

打印的html会返回乱码文本...而不是我希望在"中看到的内容"查看来源"在浏览器中。

为什么?如何轻松解决?

感谢您的帮助。

使用机械化,卷曲等的相同行为

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 个答案:

答案 0 :(得分:3)

尝试请求。 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库。请求将处理此编码并为您很好地格式化。

答案 1 :(得分: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中执行此操作的解决方案:Convert gzipped data fetched by urllib2 to HTML

由OP编辑:

阅读上述修改后的答案是:

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(打印看看)