requests.get() 返回中文乱码需优先用 r.content 解码而非 r.text;先试 r.apparent_encoding,再按 gbk、utf-8-sig 等顺序 fallback;解析 HTML 时应传 r.content + from_encoding;JSON 中 \uXXXX 是正常转义,用 json.loads 正确解码即可。

requests.get() 返回中文乱码怎么快速修复
直接原因是服务器没在响应头里声明 Content-Type 编码,或声明了但和实际内容不一致(比如标了 utf-8 实际发的是 gbk)。requests 默认用 ISO-8859-1 解码,一遇到中文就崩。
别急着改 .text,先看原始字节流:r.content 才是真实数据。修复分两步:先猜/试编码,再解码成字符串。
- 优先试
r.apparent_encoding—— requests 内置的 chardet 推测结果,多数情况准,但对短响应或混合编码容易翻车 - 如果不准,手动试常见编码:
gbk、gb2312、utf-8-sig(带 BOM 的 UTF-8)、big5(繁体) - 用
try/except UnicodeDecodeError包裹解码过程,避免程序中断
r = requests.get('http://example.com')
try:
text = r.content.decode('utf-8')
except UnicodeDecodeError:
text = r.content.decode('gbk', errors='ignore')
用 BeautifulSoup 解析乱码 HTML 时编码指定失效?
不是 BeautifulSoup 的锅,是它默认用 str(r.text) 输入,而 r.text 已经被 requests 错误解码过一次。必须把原始字节流 r.content 直接喂给 BeautifulSoup,并显式传入 from_encoding 参数。
- 不要写
BeautifulSoup(r.text, 'html.parser') - 要写
BeautifulSoup(r.content, 'html.parser', from_encoding='gbk') - 如果不确定编码,可先用
chardet.detect(r.content)看下推测结果,再传进去 - 注意:
from_encoding是 BS4 的参数,BS5 已改名成features后不再支持该参数,BS5 必须靠r.content.decode(...)预处理
JSON 接口返回中文变 \uXXXX 怎么还原?
这是正常 JSON 转义,不是乱码。Python 的 json.loads() 默认会把非 ASCII 字符转成 Unicode 转义序列,但只要解码正确,打印出来就是中文。
SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、
立即学习“Python免费学习笔记(深入)”;
- 确认响应头是
application/json,且r.content没被错误解码过 - 用
json.loads(r.text)或json.loads(r.content.decode('utf-8'))都可以,关键在 decode 步骤是否准确 - 如果
r.json()报错,说明底层r.text已损坏,立刻切回r.content+ 手动 decode - 调试时用
print(repr(data))看真实结构,别只信print(data)的输出表象
requests 自动解码不可信,什么时候该彻底禁用?
当你需要做编码探测、容错解析、或处理二进制混合内容(比如含图片的 HTTP 响应体)时,r.text 就是隐患源头。一律用 r.content 开始处理最稳妥。
- 设置
r.encoding = None可强制 requests 不自动解码r.text,此时r.text会 fallback 到r.content.decode('ISO-8859-1'),仍不安全 - 真正可靠的做法:全程忽略
r.text,只操作r.content,自己控制 decode 流程 - 对高频请求,建议封装一个
safe_get(url, encodings=['utf-8', 'gbk'])函数,按顺序尝试解码,首个成功即返回
编码问题没有银弹,服务器不守规范时,你得自己扛住探测、容错、fallback 这三层逻辑——尤其当对方用老旧 ASP 系统或本地化部署的 Java 后台时,gbk 和 ISO-8859-1 混用是常态。

















