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

52 投票
9 回答
90214 浏览
提问于 2025-04-15 21:55

我在我的Python脚本中下载了一个网页。大多数情况下,这个过程都很顺利。

不过,这次的网页返回了一个响应头:GZIP编码。当我试着在我的putty中打印这个网页的源代码时,里面全是一些奇怪的符号。

我该怎么把这些内容解码成正常的文本呢?

9 个回答

19

适用于Python 3

你可以试试这个:

import gzip

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

使用内置的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

105

我使用 zlib 来解压从网上获取的 gzipped 内容。

import zlib
import urllib

f=urllib.request.urlopen(url) 
decompressed_data=zlib.decompress(f.read(), 16+zlib.MAX_WBITS)

撰写回答