【问题标题】:python urllib2.urlopen - html text is garbled - why?python urllib2.urlopen - html 文本是乱码 - 为什么?
【发布时间】:2014-06-03 15:07:06
【问题描述】:

打印的 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

【问题讨论】:

  • 我无法复制这个。在您的上下文中,“乱码”是什么意思?我得到的 html 完全符合我的预期。

标签: python html urllib2 mechanize-python


【解决方案1】:

我使用 curl 得到了同样的乱码

curl http://www.ncert.nic.in/ncerts/textbook/textbook.htm

结果似乎被压缩了。所以这为我显示了正确的 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(打印出来查看)

【讨论】:

  • 也许检查 gzippin 之前是否存在 'Content-Encoding: gzip' 标头。
【解决方案2】:

尝试请求。 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

您会看到“内容编码”是 gzip 格式。为了使用标准 urllib 库解决这个问题,您需要使用 gzip 模块。 Mechanize 也这样做,因为它使用相同的 urllib 库。请求将处理此编码并为您很好地格式化。

【讨论】:

  • 嗨,我之前没有关于请求...所以这比使用 urllib2 更好。我可以在未来完全使用请求来代替 urllib2 并期望一切都能更好地工作。
  • 图书馆是否比请求“更好”还有待解释。我倾向于非常喜欢它,并且到目前为止使用它没有任何问题。它基于 urllib2 库,因此您的大部分操作也应该使用该库。
猜你喜欢
  • 2011-10-25
  • 1970-01-01
  • 2012-08-18
  • 2010-12-29
  • 1970-01-01
  • 1970-01-01
  • 2011-09-02
  • 2011-11-06
  • 1970-01-01
相关资源
最近更新 更多