如何处理urllib2的压缩响应?
我现在用下面的代码通过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
这里有一个更好的方法,具体内容可以查看:
作者讲解了如何分块解压,而不是一次性把所有内容都放到内存里。这种方法在处理大文件时更为推荐。
还找到一个很有用的网站可以用来测试: