什么是 encoding 和 apparent_encoding?
在使用 Python 的 requests 库获取网页内容时,经常会遇到中文乱码问题。
这通常是因为响应的字符编码(character encoding)未被正确识别。
response.encoding 是 requests 根据 HTTP 响应头(如 Content-Type)推测的编码;
而 response.apparent_encoding 则是基于响应内容本身,通过 chardet 库进行检测得出的“最可能”的编码。
两者有何区别?
encoding:依赖服务器返回的 HTTP 头信息,可能不准确或缺失。apparent_encoding:分析网页实际字节内容,更可靠但稍慢。
例如,一个中文网页实际使用 GBK 编码,但服务器未在响应头中声明编码:
r = requests.get('https://example.com')
print(r.encoding) # 可能输出 'ISO-8859-1'(默认)
print(r.apparent_encoding) # 输出 'GB2312' 或 'GBK'
如何正确设置编码?
当发现 r.text 出现乱码时,可手动指定编码:
r = requests.get(url)
r.encoding = r.apparent_encoding # 使用检测到的编码
print(r.text)
这样就能正确显示中文或其他非 ASCII 字符。
常见编码类型
Web 中常见的字符编码包括:
UTF-8:国际通用,支持所有语言,推荐首选。GBK/GB2312:中文简体常用编码。Big5:繁体中文编码。ISO-8859-1:西欧语言,requests 默认回退编码。
小贴士:避免乱码的最佳实践
- 优先使用
r.apparent_encoding检测真实编码。 - 若已知目标网站编码(如固定为 UTF-8),可直接设置
r.encoding = 'utf-8'。 - 确保你的 Python 文件本身保存为 UTF-8 编码,并在文件开头添加
# -*- coding: utf-8 -*-(Python 2 需要)。