在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)