如何处理urllib2的压缩响应?

3 投票
4 回答
8553 浏览
提问于 2025-04-15 16:46

我现在用下面的代码通过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 个回答

1

为了回答上面的评论,HTTP规范(http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.3)中提到:

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

我理解这意味着服务器应该使用“identity”。我从来没有见过不这样做的服务器。

4

你可以试试这个

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

如果不行,这里还有另一种方法,我是在requests的源代码中找到的,

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

这里有一个更好的方法,具体内容可以查看:

作者讲解了如何分块解压,而不是一次性把所有内容都放到内存里。这种方法在处理大文件时更为推荐。

还找到一个很有用的网站可以用来测试:

撰写回答