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

BeautifulSoup decode_contents转义异常及li标签合并报错问题

问题原因

  1. 标签转义:detail.decode_contents()返回的是字符串格式的HTML内容,直接追加到节点时,BeautifulSoup会将字符串内的<、>等特殊字符作为普通文本转义,不会识别为DOM节点。
  2. 换行报错:如果两个li标签之间存在换行、空格等空白内容,detail.previous_sibling获取到的是空白文本节点(NavigableString类型),该类型没有标签相关属性和方法,触发属性不存在报错。

修正代码

from bs4 import BeautifulSoup, Tag, NavigableString
soup = BeautifulSoup("""
<ol>
    <li>cccc</li>
    <li class='list_detail'>dddd</li>
    <li>aaa</li><li class='list_detail'><p>bb<i>b</i>b</p></li>
</ol>""", "html.parser")
details = soup.findAll("li", attrs={'class': "list_detail"})

for detail in details:
    # 向前查找第一个非文本的li标签节点,跳过空白换行
    prev = detail.previous_sibling
    while prev and not isinstance(prev, Tag):
        prev = prev.previous_sibling
    if not prev:
        continue
    
    # 追加br标签
    prev.append(soup.new_tag("br"))
    # 直接移动detail的所有子节点,保留原有标签结构,不会转义
    for child in list(detail.contents):
        prev.append(child)
    # 删除原detail节点
    detail.decompose()

print(soup)

运行输出

<ol>
<li>cccc<br/>dddd</li>
<li>aaa<br/><p>bb<i>b</i>b</p></li>
</ol>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 17:15:03