为什么请求知道内容字符的编码格式?

时间:2019-10-26 05:21:38

标签: python character-encoding python-requests

requests Appearance_encoding如何无法正确编码字符内容?

我有下面的代码片段,可以表达我的问题:

import requests

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

r = requests.get(url)

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

print(r.apparent_encoding)  # GB2312

为什么请求可以知道内容字符的编码格式?

3 个答案:

答案 0 :(得分:0)

Python requests使用chardet lib检查文本的外观是否像字符集。

您可以在chardet document中找到更多信息。

答案 1 :(得分:0)

requests库可以使用在响应上设置的HTTP标头来确定响应的编码。

在您的示例中:

url = "https://item.jd.com/100000177760.html"
r = requests.get(url)
print(r.headers)

结果:

{
    "Date": "Sat, 26 Oct 2019 05:24:58 GMT",
    "Content-Type": "text/html; charset=gbk",
    "Content-Length": "42964",
    "Connection": "keep-alive",
    #...
}

Content-Type标头中可以看到charset=gbk的地方。

答案 2 :(得分:0)

从响应的Content-Type标头中请求extracts编码。如果在标头中找不到编码,则响应的apparent_encoding属性为evaluated,并用作r.encoding的值。

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

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

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

因此,r.apparent_encoding不会被评估,直到通过执行print(r.apparent_encoding)对其进行显式访问为止。

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