使用美汤时如何找出正确的编码?



在python3和beautifulsoup4中,我想在发出请求后从网站获取信息。我这样做了:

import requests
from bs4 import BeautifulSoup
req = requests.get('https://sisgvarmazenamento.blob.core.windows.net/prd/PublicacaoPortal/Arquivos/201901.htm').text
soup = BeautifulSoup(req,'lxml')
soup.find("h1").text
'rn                        CÃx82MARA MUNICIPAL DE SÃx83O PAULO'

我不知道编码是什么,但它是一个带有巴西葡萄牙语的网站,所以它应该是 utf-8 或拉丁语1

请问,有没有办法找出哪种编码是正确的?

然后美汤读对这个编码正确吗?

请求按如下方式确定编码:

当您收到响应时,请求会在您访问Response.text属性时猜测用于解码响应的编码。请求将首先检查 HTTP 标头中的编码,如果没有,将使用 chardet 尝试猜测编码。

请求唯一不会执行此操作的情况是 HTTP 标头中不存在显式字符集并且内容类型标头包含文本。在此情况下,RFC 2616 指定默认字符集必须是 ISO-8859-1。在这种情况下,请求遵循规范。如果需要其他编码,可以手动设置Response.encoding属性,或使用原始Response.content

检查请求标头显示确实"HTTP 标头中不存在显式字符集,并且内容类型标头包含文本">

>>> req.headers['content-type']
'text/html'

因此,请求忠实地遵循标准并解码为 ISO-8859-1(拉丁语-1)。

在响应内容中,指定了一个字符集:

<META http-equiv="Content-Type" content="text/html; charset=utf-16">

然而,这是错误的:解码为 UTF-16 会产生莫吉巴克。

chardet正确地将编码标识为 UTF-8。

所以总结一下:

  • 没有通用的方法可以完全准确地确定文本编码
  • 在这种特殊情况下,正确的编码是 UTF-8。

工作代码:

>>> req.encoding = 'UTF-8'
>>> soup = bs4.BeautifulSoup(req.text,'lxml')
>>> soup.find('h1').text
'rn                        CÂMARA MUNICIPAL DE SÃO PAULO'

使用请求时,可以使用编码函数,例如:

req = requests.get('https://sisgvarmazenamento.blob.core.windows.net/prd/PublicacaoPortal/Arquivos/201901.htm')
encoding = req.encoding
text = req.content
decoded_text = text.decode(encoding)

最新更新