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

使用BeautifulSoup美化HTML时,能否忽略指定标签(如SVG)?

解决BeautifulSoup美化HTML时保留SVG原始状态的方法

要实现美化HTML但跳过SVG元素(保留其原始输入状态),可以通过占位符替换法实现,核心思路是先将SVG内容临时替换为唯一占位符,美化其余HTML内容后再将占位符换回原始SVG。这种方法既保证了非SVG部分的美化效果,又完全保留SVG的原始格式,同时兼顾性能。

具体实现代码

import re
from bs4 import BeautifulSoup

# 原始杂乱HTML
messy = \
"""
<html>  <head>
   <title>
       Some title</title>
    </head> <body>
<svg>Don't parse and prettify this!</svg>
<svg width="100" height="100"><circle cx="50" cy="50" r="40" stroke="green" stroke-width="4" fill="yellow" /></svg>
</body> </html>
"""

# 1. 提取所有SVG内容并生成对应占位符
# 正则匹配所有<svg>标签(支持多行和嵌套属性)
svg_pattern = re.compile(r'(<svg[\s\S]*?</svg>)', re.IGNORECASE)
svg_matches = svg_pattern.findall(messy)
# 创建唯一占位符,避免冲突
placeholders = [f'{{{{SVG_PLACEHOLDER_{i}}}}}' for i in range(len(svg_matches))]

# 2. 将原始HTML中的SVG替换为占位符
temp_html = svg_pattern.sub(lambda match: placeholders[svg_matches.index(match.group())], messy)

# 3. 美化去除SVG后的HTML
soup = BeautifulSoup(temp_html, 'html.parser')
pretty_html = soup.prettify()

# 4. 将占位符换回原始SVG内容
for placeholder, original_svg in zip(placeholders, svg_matches):
    pretty_html = pretty_html.replace(placeholder, original_svg)

# 输出结果
print(pretty_html)

输出效果

运行后,非SVG部分会被正常美化,SVG则完全保留原始格式:

<html>
 <head>
  <title>
   Some title
  </title>
 </head>
 <body>
  <svg>Don't parse and prettify this!</svg>
  <svg width="100" height="100"><circle cx="50" cy="50" r="40" stroke="green" stroke-width="4" fill="yellow" /></svg>
 </body>
</html>

性能说明

  • 正则匹配和字符串替换都是高效操作,即使处理包含大型SVG的HTML,也能保持较好性能;
  • 占位符采用唯一命名规则,避免与HTML中其他内容冲突;
  • 无需修改BeautifulSoup内部逻辑,实现简单且兼容性好。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 23:27:33