python - 请求如何确定响应的编码?
问题描述
响应的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)
请求如何确定响应的字符编码?
解决方案
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。
推荐阅读
- linux - 在linux中,用户模式堆栈存储在哪里?
- sql - 需要帮助来查找查询中的问题并对其进行优化
- python - QSyntaxHighlighter 的 QRegExp 和单引号文本
- amazon-web-services - Amazon EC2 到 AWS Elasticache Redis 连接问题
- android - 在 Kotlin 中使用 Retrofit 和 RxJava 2 获取 JSON 结果
- c# - 并行运行多个任务。如何获取 TaskCancelledException 背后的原因?
- node.js - Puppeteer - UnhandledPromiseRejectionWarning
- postgresql - Docker Postgresql 错误提示:服务器必须由拥有数据目录 postgresql rhel 的用户启动
- javascript - 以角度循环遍历数组时无法读取 0 未定义的属性
- c++ - 返回被删除节点的值