BeautifulSoup美化编码非英语(西里尔字母)字符奇怪



我有带有西里尔字符的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的回答),从调用中删除formatter='html'来美化将阻止BeautifulSoup转换西里尔字符。不幸的是,这也删除了文档中的任何&nbsp字符。在看了BS4的输出格式化器文档之后,解决方案似乎是使用BS的formatter类创建一个自定义格式化器,并在对prettify -soup.prettify(formatter=my_formatter)的调用中指定它。不过,我还不确定这将带来什么。我已经发布了这个Stackoverflow问题,试图解决这个单独的问题。(格式美化以同时保留& &;nbsp和Cryillic字符编辑:见问题的答案-我终于弄明白了。)

来自文档:

如果传入formatter="html", Beautiful Soup会尽可能将Unicode字符转换为HTML实体。

如果不需要,不要使用HTML格式化器:

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

相关内容

  • 没有找到相关文章

最新更新