BeautifulSoup格式化HTML如何同时保留 与西里尔字符?
实现方案
完全可以通过自定义BeautifulSoup的formatter实现需求,无需额外引入第三方依赖,核心逻辑如下:
仅对HTML语法要求必须转义的特殊字符做处理,西里尔等非特殊字符原样输出,同时单独将\xa0(BeautifulSoup解析后 对应的Unicode字符)替换为 实体。
代码实现
方式1:函数式自定义formatter(适合简单场景)
from bs4 import BeautifulSoup def custom_formatter(s): # 处理HTML必须转义的基础字符 s = s.replace("&", "&") s = s.replace("<", "<") s = s.replace(">", ">") s = s.replace('"', """) # 单独替换不间断空格为 实体 s = s.replace("\xa0", " ") return s # 测试示例 raw_html = """ <div>Привет мир! 测试内容</div> """ soup = BeautifulSoup(raw_html, "html.parser") pretty_html = soup.prettify(formatter=custom_formatter) print(pretty_html)
方式2:继承HTMLFormatter类(适合复杂定制场景)
可以复用BeautifulSoup内置的转义逻辑,避免自行处理遗漏转义场景:
from bs4 import BeautifulSoup from bs4.formatter import HTMLFormatter class CustomHTMLFormatter(HTMLFormatter): def escape(self, s): # 调用父类内置的最小转义逻辑,处理必须转义的字符 s = super().escape(s) # 替换不间断空格为 实体 return s.replace("\xa0", " ") # 使用示例 formatter = CustomHTMLFormatter(indent=2) pretty_html = soup.prettify(formatter=formatter)
替代方案
如果不想自行实现formatter逻辑,也可以使用第三方包html5print完成HTML美化,默认就会保留非ASCII字符和 实体。
内容的提问来源于stack exchange,提问作者bikz
相关产品推荐
相关产品推荐

