You need to enable JavaScript to run this app. 如何使用bs4抓取两个未嵌套标签间的指定内容(解决同类标签重复问题)
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.01 03:36:03