首页 > 解决方案 > 请求如何确定响应的编码?

问题描述

响应的apparent_encoding属性如何不正确?

我有以下代码片段,演示了我的问题:

import requests

url = "https://item.jd.com/100000177760.html"

r = requests.get(url)

print(r.status_code, r.encoding)  # 200, gbk (correct)

print(r.apparent_encoding)  # GB2312 (wrong)

请求如何确定响应的字符编码?

标签: pythoncharacter-encodingpython-requests

解决方案


Requests从响应的 Content-Type 标头参数中提取编码。charset如果charset在标头中没有找到并且内容类型是“文本”类型,则假定为 ISO-8859-1 (latin-1)。否则,响应的apparent_encoding属性将被评估并用作 的值r.encoding

apparent_encoding是通过使用chardet库猜测响应正文的编码来确定的。

对于问题中的 URL,编码在 Content-Type 标头中声明

>>> r.headers['Content-Type']
'text/html; charset=gbk'

所以r.apparent_encoding直到通过执行显式访问它才被评估print(r.apparent_encoding)

在这种特殊情况下,chardet 似乎弄错了:响应的文本属性可以使用 gbk 编解码器进行编码,但不能使用 GB2312。


推荐阅读