[英]How to find out the correct encoding when using beautifulsoup?
在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
'\r\n CÃ\x82MARA MUNICIPAL DE SÃ\x83O PAULO'
我不知道編碼是什么,但是它是一個使用巴西葡萄牙語的網站,因此應該是utf-8或latin1
拜托,有沒有辦法找出哪種編碼是正確的?
然后beautifulsoup是否正確讀取此編碼?
使用請求時,可以使用編碼功能,例如:
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)
請求確定像編碼此 :
收到響應時,請求會在訪問
Response.text
屬性時猜測用於解碼響應的編碼。 請求將首先檢查HTTP標頭中的編碼,如果不存在,將使用chardet嘗試猜測編碼。只有在HTTP標頭中沒有顯式字符集並且Content-Type標頭包含文本的情況下,Requests才會這樣做。 在這種情況下,RFC 2616指定默認字符集必須為ISO-8859-1。 在這種情況下,請求遵循規范。 如果需要其他編碼,則可以手動設置
Response.encoding
屬性,或使用原始Response.content
。
檢查請求標頭表明確實“ HTTP標頭中沒有顯式字符集,並且Content-Type標頭包含文本”
>>> req.headers['content-type']
'text/html'
因此,要求忠實地遵循標准並解碼為ISO-8859-1(latin-1)。
在響應內容中,指定了一個字符集:
<META http-equiv="Content-Type" content="text/html; charset=utf-16">
但這是錯誤的:因為UTF-16解碼會產生mojibake。
chardet
正確地將編碼標識為UTF-8。
總結一下:
工作代碼:
>>> req.encoding = 'UTF-8'
>>> soup = bs4.BeautifulSoup(req.text,'lxml')
>>> soup.find('h1').text
'\r\n CÂMARA MUNICIPAL DE SÃO PAULO'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.