3

我目前使用以下代码来解压缩 urllib2 的 gzipped 响应:

opener = urllib2.build_opener()
response = opener.open(req)
data = response.read()
if response.headers.get('content-encoding', '') == 'gzip':
    data = StringIO.StringIO(data)
    gzipper = gzip.GzipFile(fileobj=data)
    html = gzipper.read()

它是否也处理放气响应还是我需要编写单独的代码来处理放气响应?

4

4 回答 4

4

有一个更好的方法概述在:

作者解释了如何逐块解压,而不是在内存中一次全部解压。当涉及较大文件时,这是首选方法。

还发现了这个有用的测试站点:

于 2010-10-28T01:01:37.457 回答
4

你可以试试

if response.headers.get('content-encoding', '') == 'deflate':
    html = zlib.decompress(response.read())

如果失败,这是另一种方式,我在请求源代码中找到它,

if response.headers.get('content-encoding', '') == 'deflate':
    html = zlib.decompressobj(-zlib.MAX_WBITS).decompress(response.read())
于 2012-03-06T12:18:16.210 回答
1

为了回答上述评论,HTTP 规范(http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.3)说:

如果请求中没有 Accept-Encoding 字段,服务器可以假设客户端将接受任何内容编码。在这种情况下,如果“身份”是可用的内容编码之一,那么服务器应该使用“身份”内容编码,除非它有额外的信息表明不同的内容编码对客户端有意义。

我认为这意味着它应该使用身份。我从来没有见过没有的服务器。

于 2009-12-08T06:10:58.063 回答
1

你可以在urllib3中看到代码

class DeflateDecoder(object):

    def __init__(self):
        self._first_try = True
        self._data = binary_type()
        self._obj = zlib.decompressobj()

    def __getattr__(self, name):
        return getattr(self._obj, name)

    def decompress(self, data):
        if not data:
            return data

        if not self._first_try:
            return self._obj.decompress(data)

        self._data += data
        try:
            return self._obj.decompress(data)
        except zlib.error:
            self._first_try = False
            self._obj = zlib.decompressobj(-zlib.MAX_WBITS)
            try:
                return self.decompress(self._data)
            finally:
                self._data = None


class GzipDecoder(object):

    def __init__(self):
        self._obj = zlib.decompressobj(16 + zlib.MAX_WBITS)

    def __getattr__(self, name):
        return getattr(self._obj, name)

    def decompress(self, data):
        if not data:
            return data
        return self._obj.decompress(data)
于 2016-06-04T18:18:19.277 回答