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

如何在BeautifulSoup中无需二次解析将&amp;lt;和&amp;gt;解析为<>?

解决BeautifulSoup无法识别双重转义HTML标签的问题

问题核心:你提供的HTML里的&amp;lt;b&amp;gt;是双重转义的结果——原本的<b>先被转成&lt;b&gt;,之后又被转了一次,变成&amp;lt;b&amp;gt;。直接用BeautifulSoup解析时,它只会解码第一层,把&amp;lt;变成<字符,所以这些内容只是普通文本,不是真正的HTML标签,自然找不到<b>。

不用两次解析的解决方法有两种:

方法一:先解码实体再解析

直接用Python标准库的html.unescape()把原始HTML字符串解码一次,再传给BeautifulSoup解析,这样就能得到真正的<b>标签:

from bs4 import BeautifulSoup
import html

raw_html = '<div>This is &amp;lt;b&amp;gt;bold&amp;lt;/b&amp;gt; text.</div>'
# 先解码双重转义的实体
decoded_html = html.unescape(raw_html)
soup = BeautifulSoup(decoded_html, 'html.parser')
print(soup.find('b'))  # 输出 <b>bold</b>

方法二:解析后处理文本节点

如果已经完成初始解析,也可以直接找到包含转义内容的文本节点,解码后替换成解析后的HTML元素:

from bs4 import BeautifulSoup
import html

raw_html = '<div>This is &amp;lt;b&amp;gt;bold&amp;lt;/b&amp;gt; text.</div>'
soup = BeautifulSoup(raw_html, 'html.parser')
div_tag = soup.find('div')

# 解码div内的文本内容
decoded_text = html.unescape(div_tag.string)
# 清空div原有内容,添加解码后解析的HTML
div_tag.clear()
div_tag.append(BeautifulSoup(decoded_text, 'html.parser'))

print(soup.find('b'))  # 同样能找到<b>标签

至于你之前用prettify(formatter=None)再解析能成功,是因为这个方法会把解析后的<和>字符直接输出为文本,相当于把文本形式的<b>还原成了HTML标签字符串,二次解析时自然能识别,但这种方式确实多了一次解析步骤,上面的方法更高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 07:35:22