如何在BeautifulSoup中无需二次解析将&lt;和&gt;解析为<>?
解决BeautifulSoup无法识别双重转义HTML标签的问题
问题核心:你提供的HTML里的&lt;b&gt;是双重转义的结果——原本的<b>先被转成<b>,之后又被转了一次,变成&lt;b&gt;。直接用BeautifulSoup解析时,它只会解码第一层,把&lt;变成<字符,所以这些内容只是普通文本,不是真正的HTML标签,自然找不到<b>。
不用两次解析的解决方法有两种:
方法一:先解码实体再解析
直接用Python标准库的html.unescape()把原始HTML字符串解码一次,再传给BeautifulSoup解析,这样就能得到真正的<b>标签:
from bs4 import BeautifulSoup import html raw_html = '<div>This is &lt;b&gt;bold&lt;/b&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 &lt;b&gt;bold&lt;/b&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
相关产品推荐
相关产品推荐

