You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

BeautifulSoup格式化HTML如何同时保留&nbsp与西里尔字符?

实现方案

完全可以通过自定义BeautifulSoup的formatter实现需求,无需额外引入第三方依赖,核心逻辑如下:
仅对HTML语法要求必须转义的特殊字符做处理,西里尔等非特殊字符原样输出,同时单独将\xa0(BeautifulSoup解析后 对应的Unicode字符)替换为 实体。

代码实现

方式1:函数式自定义formatter(适合简单场景)

from bs4 import BeautifulSoup

def custom_formatter(s):
    # 处理HTML必须转义的基础字符
    s = s.replace("&", "&")
    s = s.replace("<", "&lt;")
    s = s.replace(">", "&gt;")
    s = s.replace('"', "&quot;")
    # 单独替换不间断空格为&nbsp;实体
    s = s.replace("\xa0", "&nbsp;")
    return s

# 测试示例
raw_html = """
<div>Привет мир!&nbsp;测试内容</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)
        # 替换不间断空格为&nbsp;实体
        return s.replace("\xa0", "&nbsp;")

# 使用示例
formatter = CustomHTMLFormatter(indent=2)
pretty_html = soup.prettify(formatter=formatter)

替代方案

如果不想自行实现formatter逻辑,也可以使用第三方包html5print完成HTML美化,默认就会保留非ASCII字符和&nbsp;实体。

内容的提问来源于stack exchange,提问作者bikz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 09:27:01