BeautifulSoup decode_contents转义异常及li标签合并报错问题
问题原因
- 标签转义:
detail.decode_contents()返回的是字符串格式的HTML内容,直接追加到节点时,BeautifulSoup会将字符串内的<、>等特殊字符作为普通文本转义,不会识别为DOM节点。 - 换行报错:如果两个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
相关产品推荐
相关产品推荐

