在Python中,如何解码GZIP编码?

我在我的python脚本中下载了一个网页。 在大多数情况下,这工作正常。

然而,这个有一个响应头:GZIP编码,当我试图打印这个网页的源代码,它有我的腻子中的所有符号。

如何解码这个正则文本?

我使用zlib解压缩来自web的gzip内容。

import zlib ... # f=urllib2.urlopen(url) decompressed_data=zlib.decompress(f.read(), 16+zlib.MAX_WBITS) 

使用内置的gzip模块解压缩字节stream。

如果您有任何问题,请显示您使用的确切的最小代码,确切的错误消息和回溯,以及print repr(your_byte_stream[:100])

更多信息

1.有关gzip / zlib / deflate混淆的解释,请阅读本维基百科文章的“其他用途”部分。

2.如果你有一个string而不是一个文件,使用zlib模块比gzip模块更容易。 不幸的是, Python文档不完整/错误:

“”“”zlib.decompress(string [,wbits [,bufsize]])… wbits的绝对值是压缩数据时使用的历史缓冲区大小(“窗口大小”)的基数的两倍对数。对于最新版本的zlib库,绝对值应该介于8到15之间,较大的值会导致更好的压缩,但会增加内存使用量。默认值为15.当wbits为负时,标准gzip头被抑制;这是zlib库的一个未公开的function,用于兼容unzip的压缩文件格式。“”“

首先,8 <= log2_window_size <= 15,具有上面给出的含义。 那么应该是什么应该是一个单独的参数顶部:

arg == log2_window_size表示假定string采用zlib格式(RFC 1950; HTTP 1.1 RFC 2616将deflate称为“deflate”)。

arg == -log2_window_size表示假定string是放缩格式(RFC 1951;实际上没有仔细阅读HTTP 1.1 RFC的人)

arg == 16 + log_2_window_size表示假定string采用gzip格式(RFC 1952)。 所以你可以用31。

以上信息logging在zlib C库手册中 … Ctrl-FsearchwindowBits

我使用类似的东西:

 f = urllib2.urlopen(request) data = f.read() try: from cStringIO import StringIO from gzip import GzipFile data2 = GzipFile('', 'r', 0, StringIO(data)).read() data = data2 except: #print "decompress error %s" % err pass return data 

为python3

试试这个

  import gzip fetch = opener.open(request) # basically get a response object data = gzip.decompress(fetch.read()) data = str(data,'utf-8') 

类似于沙图对python3的回答,但排列有点不同:

 import gzip s = Request("https://someplace.com", None, headers) r = urlopen(s, None, 180).read() try: r = gzip.decompress(r) except OSError: pass result = json_load(r.decode()) 

这个方法允许在尝试中包装gzip.decompress(),除了捕获和传递OSError,这可能会导致混合的压缩和未压缩的数据。 一些小string如果被编码,实际上会变得更大,所以原来的数据被发送。

您可以使用urllib3轻松解码gzip。

 urllib3.response.decode_gzip(response.data)