簡體   English   中英

BeautifulSoup 奇怪地美化了非英語(西里爾文)字符的編碼

[英]BeautifulSoup prettify encoding non-English (Cyrillic) characters strangely

我有帶有西里爾字符的 HTML。 我正在使用 BeautifulSoup4 來處理這個。 它工作得很好,但是當我去美化時,它會將所有西里爾字符轉換為其他字符。 這是一個使用 Python3 的虛擬示例:

from bs4 import BeautifulSoup

hello = '<span>Привет, мир</span>'
soup = BeautifulSoup(hello, 'html.parser')
print("Before prettify:\n{}".format(soup))
soup = soup.prettify(formatter='html')
print("\nafter prettify:\n{}".format(soup))

這是它生成的輸出:

Before prettify:
<span>Привет, мир</span>

after prettify:
<span>
 &Pcy;&rcy;&icy;&vcy;&iecy;&tcy;, &mcy;&icy;&rcy;
</span>

它正在正確格式化 HTML(將標簽放在它們的行上),但它將西里爾字符轉換為其他字符(老實說,我什至不確定它是什么編碼。)

我嘗試了各種方法來防止這種情況發生; prettify(encoding=None, formatter='html') , prettify(encoding='utf-8', formatter='html') ,我也嘗試改變我創建湯對象的方式: soup = BeautifulSoup(hello.encode('utf-8'), 'html.parser')soup = BeautifulSoup(hello, 'html.parser', from_encoding='utf-8') - 在美化過程中,西里爾字母字符的變化似乎沒有任何改變。

我認為這一定是我在某處使用編碼參數犯的一個非常簡單的錯誤,但是在搜索互聯網和 BS4 文檔后,我無法弄清楚這一點。 有沒有辦法使用 BeautifulSoup 的美化,但保持原來的西里爾字符,或者這是不可能的?

編輯:我現在已經意識到(感謝 DYZ 的回答),從對 prettify 的調用中刪除formatter='html'將阻止 BeautifulSoup 轉換西里爾字符。 不幸的是,這也會刪除文檔中的任何&nbsp字符。 在查看了BS4 的 output-formatters 文檔之后,似乎解決方案可能會使用 BS 的 Formatter 類創建自定義格式化程序,並在調用 prettify soup.prettify(formatter=my_formatter) 不過,我還不確定這會帶來什么。

文檔

如果您傳入 formatter="html",Beautiful Soup 將盡可能將 Unicode 字符轉換為 HTML 實體。

如果這是不可取的,請不要使用 HTML 格式化程序:

soup.prettify()
#'<span>\n Привет, мир\n</span>'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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