解压缩数据时出错-3:错误的标题检查 - urllib2

时间:2014-10-20 19:53:16

标签: python python-2.7

我正在使用以下代码检查网址状态:

h = httplib2.Http()
hdr = {'User-Agent': 'Mozilla/5.0'}
resp = h.request("http://" + url, headers=hdr)
if int(resp[0]['status']) < 400:
    return 'ok'
else:
    return 'bad'

并获得

Error -3 while decompressing data: incorrect header check

我正在检查的网址是:

http://www.sueddeutsche.de/wirtschaft/deutschlands-innovationsangst-wir-neobiedermeier-1.2117528

异常位置是:

Exception Location: C:\Python27\lib\site-packages\httplib2-0.9-py2.7.egg\httplib2\__init__.py in _decompressContent, line 403

try:
    encoding = response.get('content-encoding', None)
    if encoding in ['gzip', 'deflate']:
        if encoding == 'gzip':
            content = gzip.GzipFile(fileobj=StringIO.StringIO(new_content)).read()
        if encoding == 'deflate':
            content = zlib.decompress(content) ##<---- error line
        response['content-length'] = str(len(content))
        # Record the historical presence of the encoding in a way the won't interfere.
        response['-content-encoding'] = response['content-encoding']
        del response['content-encoding']
except IOError:
    content = ""

http状态为200,对于我的情况为ok,但我收到此错误

我实际上只需要http状态,为什么要阅读整个内容?

2 个答案:

答案 0 :(得分:2)

您可能有多种原因选择httplib2,但使用python模块requests获取HTTP请求的状态代码非常容易。使用以下命令安装:

$ pip install requests

请参阅下面的简单示例。

In [1]: import requests as rq

In [2]: url = "http://www.sueddeutsche.de/wirtschaft/deutschlands-innovationsangst-wir-neobiedermeier-1.2117528"

In [3]: r = rq.get(url)

In [4]: r
Out[4]: <Response [200]>

Link

除非您有明确需要httplib2的相当大的限制,否则此解决您的问题。

答案 1 :(得分:1)

这可能是httplib2中的错误(或只是不常见的设计决定)。我不会在2.x stdlib中使用urllib2httplib,或者在3.x stdlib中使用urllib.requesthttp.client,或者第三个 - 共享图书馆requestsurllib3pycurl

那么,您是否需要使用此特定库?

如果是这样的话:

  

我实际上只需要http状态,为什么要阅读整个内容?

好吧,大多数 HTTP库将在返回控件之前读取和解析整个内容,或者至少解析标题。通过这种方式,他们可以响应有关标头或分块编码或MIME信封的简单请求或任何延迟。

此外,他们中的许多人都会自动执行100次继续,302重定向,各种身份验证等操作,如果他们没有提前阅读,他们就无法做到这一点。特别是,根据description for httplib2,自动处理这些事情是您首先应该使用它的主要原因之一。

此外,第一个TCP read几乎总是会包含标题,那么为什么读取它们?

这意味着如果标头无效,您可能会立即收到异常。无论如何,他们仍然可以提供获取状态代码(或原始标题或其他信息)的方法。


作为旁注,如果您只想要HTTP状态,则应该发送HEAD请求而不是GET。除非您正在编写和测试服务器,否则您几乎总是可以依赖这样一个事实:the RFC says,状态和标题应该与您GET所获得的相同。事实上,在这种情况下,几乎可以肯定地解决问题 - 如果没有机构可以解压缩,httplib2已经混淆了认为身体在没有得到胜利的情况下被压缩的事实。无论如何。