在Python中,如何解码GZIP编码?
我在我的Python脚本中下载了一个网页。大多数情况下,这个过程都很顺利。
不过,这次的网页返回了一个响应头:GZIP编码。当我试着在我的putty中打印这个网页的源代码时,里面全是一些奇怪的符号。
我该怎么把这些内容解码成正常的文本呢?
9 个回答
适用于Python 3
你可以试试这个:
import gzip
fetch = opener.open(request) # basically get a response object
data = gzip.decompress(fetch.read())
data = str(data,'utf-8')
使用内置的gzip模块来解压你的字节流。
如果你遇到任何问题,请提供你使用的最简代码、具体的错误信息和追踪记录,以及运行print repr(your_byte_stream[:100])
的结果。
更多信息
1. 关于gzip/zlib/deflate之间的混淆,可以查看这篇维基百科文章的“其他用途”部分。
2. 如果你处理的是字符串而不是文件,使用zlib模块可能会比gzip模块更简单。不过,遗憾的是,Python文档并不完整或有误:
zlib.decompress(string[, wbits[, bufsize]])
...wbits的绝对值是压缩数据时使用的历史缓冲区(“窗口大小”)的二进制对数。对于最新版本的zlib库,它的绝对值应该在8到15之间,较大的值可以获得更好的压缩效果,但会占用更多内存。默认值是15。当wbits为负数时,标准的gzip头部会被抑制;这是zlib库的一个未记录的特性,用于与unzip的压缩文件格式兼容。
首先,8 <= log2_window_size <= 15,以上述含义为准。然后,应该是一个单独的参数被“强行”放在上面:
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
。
我使用 zlib 来解压从网上获取的 gzipped 内容。
import zlib
import urllib
f=urllib.request.urlopen(url)
decompressed_data=zlib.decompress(f.read(), 16+zlib.MAX_WBITS)