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
为什么请求可以知道内容字符的编码格式?
答案 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进行编码。