如何使用bs4抓取两个未嵌套标签间的指定内容(解决同类标签重复问题)
使用BeautifulSoup抓取两个平级标签之间的指定内容
问题本质
原有代码直接全文档匹配class="div"的元素,没有限定抓取范围,因此会抓取到Title 2之后的所有符合条件的节点。解决核心是先锁定两个边界h3节点,仅遍历两个节点之间的平级兄弟元素。
实现方案
方案1:通过next_until快速获取区间节点
next_until是BeautifulSoup节点对象的内置方法,可直接遍历当前节点后续的所有平级兄弟节点,直到遇到指定的终止节点,无需手动控制遍历终止逻辑。
示例代码:
from bs4 import BeautifulSoup # 替换为实际的HTML解析逻辑 html = '''<h3>Title 1</h3> <div class="div"> <span class="span">span1</span> <label class="label">label1</label> </div> <div class="div"> <span class="span">span2</span> </div> <h3>Title 2</h3> <div class="div"> <span class="span">span3</span> <label class="label">label2</label> </div> <div id="div"> <span id="span">span4</span> </div>''' soup = BeautifulSoup(html, 'html.parser') # 定位两个边界h3,可根据实际需求调整定位规则 h3_start = soup.find('h3', text='Title 1') h3_end = soup.find('h3', text='Title 2') # 遍历两个h3之间的所有节点 for node in h3_start.next_until(h3_end): # 筛选class为div的节点,提取span文本 if node.name == 'div' and node.get('class') == ['div']: print(node.span.text)
输出结果:
span1 span2
方案2:手动遍历next_siblings自定义逻辑
如果需要在遍历过程中增加更多判断规则,可手动遍历起始h3的后续兄弟节点,遇到终止h3时跳出循环:
h3_start = soup.find('h3', text='Title 1') h3_end = soup.find('h3', text='Title 2') for sibling in h3_start.next_siblings: if sibling == h3_end: break if sibling.name == 'div' and 'div' in sibling.get('class', []): print(sibling.span.text)
适配动态场景调整
如果h3的文本是动态生成的,无需按文本匹配,可直接通过位置定位边界:
# 获取所有h3节点,按位置取第1、第2个作为起止边界 all_h3 = soup.find_all('h3') h3_start, h3_end = all_h3[0], all_h3[1]
内容的提问来源于stack exchange,提问作者user13006535
相关产品推荐
相关产品推荐

