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会根据HTTP标头对响应的编码进行有根据的猜测。当您访问r.text时,将使用由Requests猜测的文本编码。您可以使用r.encoding属性找出请求使用的编码,并进行更改。
>>> r.encoding
'utf-8'
>>> r.encoding = 'ISO-8859-1'
检查用于您的页面的编码请求,如果它不正确 - 尝试强制它是您需要的。
关于requests
和urllib.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?的主要内容,如果未能解决你的问题,请参考以下文章