【问题标题】:python inconsistent behaviour reading content from EU web page [duplicate]python从欧盟网页读取内容的行为不一致[重复]
【发布时间】:2013-11-12 19:25:51
【问题描述】:

我正在尝试从以下欧盟页面中提取内容:

http://europa.eu/about-eu/countries/member-countries/greece/index_el.htm

并尝试使用 urllib2 和 mechanize 打开页面,但我得到一些乱码,奇怪的编码文本。

url='http://europa.eu/about-eu/countries/member-countries/greece/index_el.htm'

browser = mechanize.Browser()
browser.set_handle_robots(False)
cookies = mechanize.CookieJar()
browser.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US)     AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.517.41 Safari/534.7')]

a=browser.open(url,timeout=5)
content=a.read()

给予

>>> content[:100]
'\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03\xbcW\xddo\x1b\xc7\x11\x7fv\xfe\x8a\xf5\x050\x12\xc0\xe4I\xfejkS\x0c\\\x89M\x8c\xfa\xab\xb2\x84\xa2\x08\x0cay\xb7<\xae\xb9\xb7{\xbe\xdb\xa3\xcc\x16\x05$\xcb\xae\xeb\xc0\x0eP\xa4F\x9f\x8a6\xe8\xabcWQTWV\\\xbd\xc4\xafG\xf9?\xea\xcc\xdd\xf1x\xa4HK:\xc9\\A\xe4r?'

但有时它会起作用:

>>> content[:100]
'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd'

那么我该怎么做才能避免遇到这个问题呢?

【问题讨论】:

  • 我怀疑有些响应被压缩了。检查transfer-encoding 标头。
  • 如何查看表头?
  • 如果是,请查看here,同样here
  • 我得到 KeyError: 'content-encoding' 错误

标签: python html web-scraping mechanize


【解决方案1】:

您正在接收 gzip 压缩的内容;测试 Content-Encoding 标头并解压:

import zlib

if a.info().get('Content-Encoding', '').lower() == 'gzip':
    decompressor = zlib.decompressobj(16 + zlib.MAX_WBITS)
    content = decompressor.decompress(content)

或者,使用出色的python-requests library,它会为您处理会话,但也会透明地为您解压缩 gzip 并缩小响应。

【讨论】:

  • 这些是我拥有的键: a=r.info() a.keys() ['content-length', 'via', 'content-language', 'x-cache', 'accept-ranges', 'server', 'last-modified', 'connection', 'etag', 'date', 'content-type', 'age']
  • @hmghaly:你确定那是压缩响应吗?
  • @hmghaly:您在问题中使用的 URL 肯定会给 me Content-Encoding: gzip 响应。
  • @MartijnPieters 我也是。
  • 也许这就是问题所在,因为有时它可以正常工作,有时它会给出这种奇怪的(可能是 gzip 压缩的)输出,也许当你运行它时你得到了这个标题,会再试一次
猜你喜欢
  • 2015-06-01
  • 2014-08-05
  • 2011-10-28
  • 1970-01-01
  • 2011-10-03
  • 1970-01-01
  • 2011-03-12
  • 2020-03-09
  • 2012-01-04
相关资源
最近更新 更多