必须先解压gzip压缩流再保存为html文件,否则浏览器显示乱码或空白;唯一可靠判断依据是响应头content-encoding: gzip,而非文件后缀或肉眼判断。

直接保存 Gzip 压缩的 HTML 源码(比如从抓包、爬虫或服务器响应中拿到的原始 Content-Encoding: gzip 数据),不能直接当 HTML 文件双击打开——它本质是二进制压缩流,不是可读文本。必须先解压,再保存为 .html 文件,否则浏览器会显示乱码或空白。
怎么判断响应是否真的是 gzip 压缩?
看 HTTP 响应头有没有 Content-Encoding: gzip。这是唯一可靠依据,不要凭文件后缀或肉眼是否“乱码”判断。
- 如果用
curl -I或浏览器 DevTools 的 Network → Headers 标签页查不到这行,那数据根本没被 gzip 压缩,强行用GZIPInputStream或gzip.decompress()会报Not in GZIP format - 有些服务返回
Content-Encoding: br(Brotli),和 gzip 不兼容,需换用brotli或zstandard库 -
Transfer-Encoding: chunked是分块传输机制,和压缩无关,别混淆
Python 解压并保存为 HTML 文件
适用于 requests 抓取、Wireshark 导出的 raw gzip 数据、或本地 .gz 文件。核心是:先解压字节流,再以 UTF-8(或页面实际编码)写入文件。
- 如果是
requests.Response对象,且已确认r.headers.get("Content-Encoding") == "gzip":import gzip import requests <p>r = requests.get("<a href="https://www.php.cn/link/b05edd78c294dcf6d960190bf5bde635">https://www.php.cn/link/b05edd78c294dcf6d960190bf5bde635</a>", headers={"Accept-Encoding": "gzip"}) if r.headers.get("Content-Encoding") == "gzip": html_content = gzip.decompress(r.content).decode("utf-8") else: html_content = r.text</p><p>with open("page.html", "w", encoding="utf-8") as f: f.write(html_content) </p> - 如果是本地
response.gz文件:import gzip <p>with gzip.open("response.gz", "rb") as f: html_content = f.read().decode("utf-8") # 注意编码,部分页面用 GBK</p><p>with open("page.html", "w", encoding="utf-8") as f: f.write(html_content) </p> - 如果解压后乱码,别硬调
decode("utf-8")——先用chardet.detect()探测编码,或查响应头里的charset(如Content-Type: text/html; charset=gbk)
命令行快速解压保存(Linux/macOS/WSL)
适合处理 Wireshark 导出的 .gz 文件,或 curl 下载的压缩响应体。
- 用
gzip -d解压并重定向输出:gzip -d -c response.gz > page.html
其中-c表示输出到 stdout,避免覆盖原文件 - 如果只有原始二进制数据(无 .gz 后缀),但确认是 gzip 流,可用:
cat raw_data | gzip -d > page.html
- 注意:Windows 命令提示符不带
gzip,需装 Git for Windows、WSL 或用 7-Zip CLI:7z e -so archive.gz > page.html
Wireshark 导出 gzip HTML 的实操要点
Wireshark 本身不直接“解压显示”,而是靠导出 HTTP objects 自动识别并解压 gzip 内容。
- 过滤 HTTP 流后,右键某条 GET 请求 → Export Objects → HTTP…,在弹出窗口里勾选 “Reconstruct complete HTTP objects”
- 列表中能看到 Host、Content-Type、Content-Encoding 列,找到
Content-Encoding: gzip那行,选中 → Save As,保存为xxx.html - 别用 “Follow TCP Stream” 然后手动复制——那里面是未解压的二进制,粘贴出来就是乱码
- 如果导出后仍是乱码,大概率是页面用了非 UTF-8 编码(如 GB2312),需用编辑器重新以对应编码打开再另存
真正容易被忽略的是编码探测和 Content-Encoding 的严格匹配——很多“解压失败”其实源于误判压缩类型,或解压后没按真实字符集解码。Gzip 只负责压缩字节,不携带编码信息,这两步必须分开处理、各自验证。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











