【问题标题】:BeautifulSoup prettify encoding non-English (Cyrillic) characters strangelyBeautifulSoup 奇怪地对非英语(西里尔文)字符进行美化
【发布时间】: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>
 &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 转换西里尔字符。不幸的是,这也会删除文档中的任何 &amp;nbsp 字符。查看BS4's output-formatters documentation 之后,似乎解决方案是使用BS 的Formatter 类创建一个自定义格式化程序,并在调用美化-soup.prettify(formatter=my_formatter) 时指定它。不过,我还不确定这会带来什么。我已经发布了this Stackoverflow question 来尝试解决这个单独的问题。 (格式美化以保留 &nbsp 和 Cryillic 字符编辑:查看该问题的答案 - 我终于想通了。)

【问题讨论】:

    标签: python-3.x beautifulsoup cyrillic prettify


    【解决方案1】:

    来自documentation

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

    如果不希望这样做,请不要使用 HTML 格式化程序:

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

    【讨论】:

    • 啊,是的,我现在回想起我为什么要这样做(在美化调用中添加 formatter="html")。如果我不添加这个,prettify 会删除我的 &nbsp 字符并将它们转换为空格,不幸的是,这会扰乱 HTML 的显示方式。
    • 如果有人好奇,我已经解决了上面提到的问题 - 您可以提供一个自定义格式化程序来美化,它将保留西里尔字母和 &nbsp。请参阅我在此处发布的其他 stackoverflow 问题的答案:stackoverflow.com/questions/69790205/…
    猜你喜欢
    • 2021-12-15
    • 2017-01-10
    • 1970-01-01
    • 2021-06-27
    • 2013-09-05
    • 1970-01-01
    • 2018-07-16
    • 2017-01-01
    • 2016-10-02
    相关资源
    最近更新 更多