【发布时间】:2021-10-30 22:31:22
【问题描述】:
我有带有西里尔字符的 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>
Привет, мир
</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's output-formatters documentation 之后,似乎解决方案是使用BS 的Formatter 类创建一个自定义格式化程序,并在调用美化-soup.prettify(formatter=my_formatter) 时指定它。不过,我还不确定这会带来什么。我已经发布了this Stackoverflow question 来尝试解决这个单独的问题。 (格式美化以保留   和 Cryillic 字符编辑:查看该问题的答案 - 我终于想通了。)
【问题讨论】:
标签: python-3.x beautifulsoup cyrillic prettify