簡體   English   中英

使用beautifulsoup時如何找出正確的編碼?

[英]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。

總結一下:

  • 沒有一般的方法來確定完全准確的文本編碼
  • 在這種情況下,正確的編碼是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM