簡體   English   中英

Python-如何正確獲得重音符號? (美麗湯)

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

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