python-3.x - 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>
Привет, мир
</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'
从调用 prettify 中删除将阻止 BeautifulSoup 转换西里尔字符。不幸的是,这也会删除 
文档中的任何字符。在查看了BS4 的 output-formatters 文档之后,似乎解决方案是使用 BS 的 Formatter 类创建一个自定义格式化程序,并在调用 prettify - 时指定它soup.prettify(formatter=my_formatter)
。不过,我还不确定这会带来什么。我已经发布了这个 Stackoverflow 问题来尝试解决这个单独的问题。(格式美化以保留 和 Cryillic 字符编辑:请参阅该问题的答案 - 我终于想通了。)
解决方案
从文档中:
如果传入 formatter="html",Beautiful Soup 会尽可能将 Unicode 字符转换为 HTML 实体。
如果不希望这样做,请不要使用 HTML 格式化程序:
soup.prettify()
#'<span>\n Привет, мир\n</span>'
推荐阅读
- database - 将 Sql 数据库连接到 wcf 网络服务
- javascript - 通过单击增量按钮网页不会随着增量值更新
- excel - 具有多个日期范围条件和多个条件的 SUMIFS
- mysql - 为什么用户类型没有填充 mysql 表中的数据值?
- mapbox-gl-js - Mapbox GL JS 和 Cesium 有什么区别?
- javascript - Tronweb 没有始终如一地监听事件
- java - 如何将 Windows 时区转换为 Java 时区?
- javascript - 为与html分开的表行触发表更新javascript函数?
- javascript - 下载不适用于浏览器中的 bash 脚本
- c# - 如何在 Nunit 中使用 Assert 检查两个列表的项目是否相等