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

使用BeautifulSoup的replace_with时HTML unescape无效问题

解决BeautifulSoup替换含子元素元素时HTML实体二次转义问题

当用BeautifulSoup替换包含子元素的元素(如示例中的<span>)时,原本的子元素标签会被二次转义成HTML实体,导致输出不符合预期;但替换无嵌套子元素的元素(如<strong>)时结果正常。

问题原因

replace_with()方法接收普通字符串参数时,会自动转义字符串中的HTML特殊字符(如<、>)。示例中html.unescape(span.decode_contents())得到的是带<strong>标签的字符串,传入replace_with()后又被重新转义,最终出现&amp;lt;strong&amp;gt;这类二次转义的实体。

解决方案

方案1:直接操作DOM节点(推荐)

无需拼接字符串,直接将文本节点与原元素的子节点组合后替换,完全避免转义问题:

from bs4 import BeautifulSoup
import html

html_str = '&lt;div&gt;&lt;span&gt;&lt;strong&gt;Hello world&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;'
soup = BeautifulSoup(html_str, 'html.parser')
span = soup.select_one('span')

# 构建替换内容:前缀文本 + 原span的所有子元素 + 后缀文本
new_content = [
    soup.new_string('message: '),
    *span.contents,
    soup.new_string(', end of message')
]
# 用*解包所有节点进行替换
span.replace_with(*new_content)

# 转换为HTML字符串后转义实体,得到期望格式
print(html.escape(str(soup)))

方案2:将拼接内容解析为BeautifulSoup对象

把拼接好的HTML字符串解析为BeautifulSoup可识别的节点对象,再传入replace_with():

from bs4 import BeautifulSoup
import html

html_str = '&lt;div&gt;&lt;span&gt;&lt;strong&gt;Hello world&lt;/strong&gt;&lt;/span&gt;&lt;/div&gt;'
soup = BeautifulSoup(html_str, 'html.parser')
span = soup.select_one('span')

# 拼接HTML内容并解析为BeautifulSoup节点
new_html = f'message: {html.unescape(span.decode_contents())}, end of message'
new_content = BeautifulSoup(new_html, 'html.parser')

span.replace_with(new_content)
print(html.escape(str(soup)))

输出结果

两种方案最终都会输出符合预期的结果:

&lt;div&gt;message: &lt;strong&gt;Hello world&lt;/strong&gt;, end of message&lt;/div&gt;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 13:38:26