
本文详解 requests 库在处理 Brotli 压缩响应时因缺少解压支持导致 .text 解码异常、内容显示为乱码或编码不稳定的问题,并提供安装依赖、配置请求头及验证编码的完整解决方案。
本文详解 requests 库在处理 brotli 压缩响应时因缺少解压支持导致 `.text` 解码异常、内容显示为乱码或编码不稳定的问题,并提供安装依赖、配置请求头及验证编码的完整解决方案。
当你使用 requests.get() 访问某些现代网站(如 https://www.powerball.com/)时,可能会遇到 .text 输出忽而可读、忽而乱码的现象,即使 page.encoding 始终显示为 'utf-8'。根本原因并非编码检测错误,而是服务器返回了 Brotli(br)压缩格式 的响应体,而 requests 默认仅原生支持 gzip 和 deflate,不支持自动解压 Brotli。
可通过检查响应头确认该问题:
page = requests.get('https://www.powerball.com/', headers=HEADERS)
print(page.headers.get('Content-Encoding')) # 输出: 'br'
若返回 'br',即表明响应经过 Brotli 压缩,但 requests 未解压就直接尝试用 utf-8 解码原始二进制流,导致解码失败或结果不可预测——这正是 .text 表现不稳定的核心原因。
✅ 正确解决方案分三步:
SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、
-
安装 Brotli 解压支持(任选其一):
pip install brotli # 推荐,纯 Python 实现,兼容性好 # 或 pip install brotlicffi # CFFI 加速版本(需编译环境)
-
确保请求头中明确声明支持的压缩方式(避免触发 br 但客户端无法处理):
显式设置 'Accept-Encoding': 'gzip, deflate' 可绕过 Brotli;若需兼容 br,则必须安装上述包(requests 会自动启用):HEADERS = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36', 'Accept-Language': 'en-US,en;q=0.9', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Encoding': 'gzip, deflate', # 关键:排除 br,或依赖已安装的 brotli 自动处理 } page = requests.get('https://www.powerball.com/', headers=HEADERS) print(page.encoding) # 现在稳定为 utf-8 print(page.text[:200]) # 内容可读、无乱码 -
(进阶)手动验证与强制指定编码(防兜底):
即使解压成功,若服务器未正确声明 charset,requests 可能误判编码。建议在解压后显式指定:page = requests.get('https://www.powerball.com/', headers=HEADERS) page.encoding = 'utf-8' # 强制覆盖自动检测 print(page.text)
⚠️ 注意事项:
- 不要盲目调用 page.content.decode('utf-8') —— 若 Brotli 未解压,content 仍是压缩后的二进制,直接 decode 必然报错;
- Accept-Encoding 头中若包含 'br' 但未安装 brotli 包,requests 会静默忽略该编码并回退到未压缩响应(部分服务可能拒绝),导致请求失败或返回 406;
- 生产环境中建议始终检查 page.headers.get('Content-Encoding') 并记录日志,便于快速定位压缩相关异常。
总结:requests 的编码不一致问题,表象是字符乱码,根源常在于 Brotli 压缩未被识别与解压。安装 brotli 包 + 合理配置 Accept-Encoding,即可彻底解决该类非确定性解码问题,保障 .text 输出稳定可靠。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










