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

TIM*_*MEX 39 python encoding text ascii http

我在python脚本中下载了一个网页.在大多数情况下,这很好.

但是,这个有一个响应标题:GZIP编码,当我试图打印这个网页的源代码时,它在我的putty中有所有符号.

如何将此解码为常规文本?

YOU*_*YOU 80

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

import zlib

...
# f=urllib2.urlopen(url) 
decompressed_data=zlib.decompress(f.read(), 16+zlib.MAX_WBITS)
Run Code Online (Sandbox Code Playgroud)

  • 你能不能评论解压缩的第二个参数是什么?为什么会这样......好吧......奇怪? (7认同)

Joh*_*hin 30

使用内置的gzip模块解压缩字节流.

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

更多的信息

1.有关gzip/zlib/deflate混淆的解释,请阅读此Wikipedia文章的"其他用途"部分.

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

msgstr"""zlib.decompress(string [,wbits [,bufsize]])... wbits的绝对值是压缩数据时使用的历史缓冲区大小("窗口大小")的两个对数的基数.对于最新版本的zlib库,绝对值应在8到15之间,较大的值导致更好的压缩,代价是更大的内存使用.默认值为15.当wbits为负时,标准gzip头被抑制;这是zlib库的一个未记录的功能,用于与unzip的压缩文件格式兼容.""

首先,8 <= log2_window_size <= 15,具有上面给出的含义.然后应该是一个单独的arg在顶部被克服:

arg == log2_window_size意味着假设字符串是zlib格式(RFC 1950; HTTP 1.1 RFC 2616令人困惑地称之为"deflate").

arg == -log2_window_size意味着假设字符串是deflate格式(RFC 1951;那些没有仔细阅读HTTP 1.1 RFC的人实际实现的)

arg == 16 + log_2_window_size表示假设字符串是gzip格式(RFC 1952).所以你可以使用31.

以上信息记录在zlib C库手册中 ... Ctrl-F搜索windowBits.


Mic*_*las 11

我用的是这样的东西:

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
Run Code Online (Sandbox Code Playgroud)


Sha*_*atu 9

对于Python 3

试试这个:

import gzip

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


sim*_*eco 5

如果您使用该Requests模块,那么您不需要使用任何其他模块,因为gzipdeflate 传输编码 会自动为您解码

例子:

>>> import requests
>>> custom_header = {'Accept-Encoding': 'gzip'}
>>> response = requests.get('https://api.github.com/events', headers=custom_header)
>>> response.headers
{'Content-Encoding': 'gzip',...}
>>> response.text
'[{"id":"9134429130","type":"IssuesEvent","actor":{"id":3287933,...
Run Code Online (Sandbox Code Playgroud)

响应.text属性用于读取文本上下文中的内容。

响应.content属性是用于读取二进制上下文中的内容。

请参阅docs.python-requests.org上的二进制响应内容部分