BeautifulSoup4调用prettify时西里尔字符异常转码如何解决
解决方案
问题根因
- 当
prettify传入formatter='html'时,BeautifulSoup4默认的HTML格式化器会将所有非ASCII字符转换为对应的HTML实体,因此西里尔字符会被转义为Пр这类编码 - 不指定formatter参数时,默认格式化器会将
等空白实体直接转换为普通空格,无法保留原实体
实现方案
通过自定义HTML格式化器,即可同时实现三个需求:保留西里尔等非ASCII字符、保留 实体、正常格式化HTML结构。
完整代码示例
from bs4 import BeautifulSoup from bs4.formatter import HTMLFormatter # 构造自定义格式化器:仅保留 实体,其余非ASCII字符不转义 custom_formatter = HTMLFormatter( # 定义需要保留的HTML实体映射,仅添加需保留的 即可 entity_defs={'nbsp': '\xa0'}, # 关闭非ASCII字符自动转实体的逻辑 convert_charrefs=False ) # 测试用例,同时包含西里尔字符和 hello = '<span>Привет, мир !</span>' soup = BeautifulSoup(hello, 'html.parser') # 调用prettify时传入自定义格式化器 pretty_html = soup.prettify(formatter=custom_formatter) print(pretty_html)
输出效果
<span> Привет, мир ! </span>
扩展说明
如果需要保留其他HTML实体(比如&、<),只需在entity_defs字典中添加对应映射即可,例如:
entity_defs={ 'nbsp': '\xa0', 'amp': '&', 'lt': '<', 'gt': '>' }
内容的提问来源于stack exchange,提问作者bikz
相关产品推荐
相关产品推荐

