python requests.get()返回不正确解码的文本而不是UTF-8?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python requests.get()返回不正确解码的文本而不是UTF-8?相关的知识,希望对你有一定的参考价值。

当服务器的内容类型是“Content-Type:text / html”时。 requests.get()返回不正确编码的数据。就好像我们将内容类型明确地称为'Content-Type:text / html; charset = utf-8',它返回正确的数据。

当我们使用urllib.urlopen()时,它返回正确的数据。以前有人注意到了吗?为什么requests.get()表现得像这样?

答案

来自requests documentation

当您发出请求时,Requests会根据HTTP标头对响应的编码进行有根据的猜测。当您访问r.text时,将使用由Requests猜测的文本编码。您可以使用r.encoding属性找出请求使用的编码,并进行更改。

>>> r.encoding
'utf-8'
>>> r.encoding = 'ISO-8859-1'

检查用于您的页面的编码请求,如果它不正确 - 尝试强制它是您需要的。

关于requestsurllib.urlopen之间的差异 - 他们可能使用不同的方式来猜测编码。就这样。

另一答案

受过教育的猜测可能只是检查Content-Type标题是由服务器发送(相当误导使用受过教育的imho)。

对于响应头Content-Type: text/html,结果是ISO-8859-1(HTML4的默认值),无论任何内容分析(即HTML5的默认值是UTF-8)。

对于响应头Content-Type: text/html; charset=utf-8,结果是UTF-8。

对我们来说幸运的是,请求使用chardet库,通常效果很好(属性requests.Response.apparent_encoding),所以你通常想做:

r = requests.get("https://martin.slouf.name/")
# override encoding by real educated guess as provided by chardet
r.encoding = r.apparent_encoding
# access the data
r.text
另一答案

text / html的默认假定内容编码是ISO-8859-1 aka Latin-1 :(参见RFC-2854.UTF-8太年轻而不能成为默认值,它诞生于1993年,几乎与HTML和HTTP。

使用.content访问字节流,或使用.text访问解码的Unicode流。如果HTTP服务器不关心正确的编码,则.text的值可能会关闭。

以上是关于python requests.get()返回不正确解码的文本而不是UTF-8?的主要内容,如果未能解决你的问题,请参考以下文章

Python之requests库

python-requests模块

python-requests模块

爬虫_python3_requests_2

2.Python爬虫入门_requests

python接口测试—get请求