![](/img/trans.png)
[英]Yet another encoding issue with accented characters (scraping a Website with Python and BeautifulSoup)
[英]Python - How to get accented characters correct? (BeautifulSoup)
我已經用BeautifulSoup作為python代碼編寫了HTML,但沒有正確解決帶重音符號的問題。
HTML的字符集是這個
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
我有這個python代碼:
some_text = soup_ad.find("span", { "class" : "h1_span" }).contents[0]
some_text.decode('iso-8859-1','ignore')
我得到這個:
Calções
我在這里做錯了什么? 一些線索?
最好的祝福,
這里的問題是關於“您從哪里獲得”的信息。 如果那是您終端中接收到的輸出,則您的終端也可能期望使用不同的編碼!
您可以在使用打印時嘗試以下操作:
import sys
outenc = sys.stdout.encoding or sys.getfilesystemencoding()
print t.decode("iso-8859-1").encode(outenc)
正如bernie所指出的,BS在內部使用Unicode。
對於BS3
:
美麗的湯給你Unicode,該死
到您的文檔被解析時,它已轉換為Unicode。 Beautiful Soup在其數據結構中僅存儲Unicode字符串。
對於BS4
,文檔在發生這種情況時會更清楚地說明:
您可以傳入字符串或打開的文件句柄……首先,將文檔轉換為Unicode,將HTML實體轉換為Unicode字符……
換句話說,它立即解碼數據。 因此,如果您要獲得mojibake,則必須在它進入BS之前而不是之后進行修復。
BeautifulSoup
構造函數的輸入可以采用8位字節的字符串或文件,並嘗試找出編碼。 有關詳細信息,請參見編碼 。 您可以通過打印出soup.original_encoding
來檢查它是否猜對了。 如果沒有猜到ISO-8859-1
或同義詞,則唯一的選擇是使其明確:在傳遞字符串之前先對其進行decode
,以Unicode模式使用encoding
打開文件,等等。
來自任何BS對象的結果以及作為參數傳遞給任何方法的任何結果始終為UTF-8(如果它們是字節字符串)。 所以,調用decode('iso-8859-1')
上的東西你有BS出來是保證突破的東西,如果它沒有破碎。
而且您也不想這樣做。 正如您在評論中所說,“我正在輸出到SQLite3數據庫。” 好吧,sqlite3始終使用UTF-8。 (您可以在運行時通過pragma
更改此設置,或在編譯時更改默認設置,但這基本上會破壞Python接口,因此……請不要這樣做。)Python接口僅允許Py2 str
UTF-8(當然在Py2 unicode
/ Py3 str
,沒有編碼。)因此,如果您嘗試將BS數據編碼為Latin-1以存儲在數據庫中,則會造成問題。 只需按原樣存儲Unicode,或者根據需要將其編碼為UTF-8(僅限Py2)。
如果您不想弄清楚所有這些,只需在首次調用BeautifulSoup
之后在各處使用Unicode,就不會出錯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.