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

使用BeautifulSoup4根据同级标签区分两个相同标签的内容

解决BeautifulSoup4抓取同名元素的目标文本问题

嘿,这个场景太常见了——页面里一堆结构相似的元素,就差一点点细节区分,确实容易卡壳。咱们来搞定它!

你的核心问题是要区分两个class="class"的div,它们的差异在于内部的span:第一个div里有class="1"的span,第二个是class="2"的。我们可以利用这个差异精准定位目标文本,下面给你几种实用的方法:

方法1:用CSS选择器的:has()伪类(推荐,简洁高效)

如果你的BeautifulSoup版本在4.7.0及以上,可以直接用:has()来筛选包含特定子元素的父节点,一行代码就能搞定:

from bs4 import BeautifulSoup

html = '''
<div class="class"> <span class="1"></span> <span class="value">text I want</span> </div>
<div class="class"> <span class="2"></span> <span class="value">text I DON'T want</span> </div>
'''

soup = BeautifulSoup(html, 'html.parser')
# 找到包含span.1的div.class,再获取里面的span.value文本
desired_text = soup.select_one('div.class:has(span.1) span.value').text
print(desired_text)  # 输出:text I want

这个写法的逻辑很直观:先锁定包含class="1"的span的那个div,再在它内部找class="value"的span,完美避开第二个不需要的div。

方法2:遍历筛选(兼容性拉满,适合所有版本)

如果你的BeautifulSoup版本比较旧,不支持:has(),可以遍历所有class="class"的div,逐个检查内部的span特征:

from bs4 import BeautifulSoup

html = '''
<div class="class"> <span class="1"></span> <span class="value">text I want</span> </div>
<div class="class"> <span class="2"></span> <span class="value">text I DON'T want</span> </div>
'''

soup = BeautifulSoup(html, 'html.parser')
desired_text = ""

# 遍历所有目标div
for div in soup.find_all('div', class_='class'):
    # 检查当前div是否包含class为"1"的span
    if div.find('span', class_='1'):
        desired_text = div.find('span', class_='value').text
        break  # 找到目标后就停止遍历

print(desired_text)  # 输出:text I want

这种方法虽然代码多一点,但兼容性最好,不管你用哪个版本的BeautifulSoup都能跑通。

方法3:直接取第一个匹配元素(仅当顺序固定时用)

如果你能确定目标文本所在的div是页面中第一个出现的class="class"的div,那可以直接简化成:

from bs4 import BeautifulSoup

html = '''
<div class="class"> <span class="1"></span> <span class="value">text I want</span> </div>
<div class="class"> <span class="2"></span> <span class="value">text I DON'T want</span> </div>
'''

soup = BeautifulSoup(html, 'html.parser')
desired_text = soup.find('div', class_='class').find('span', class_='value').text
print(desired_text)  # 输出:text I want

不过这个方法有局限性——如果页面结构变动,目标div的位置变了,结果就错了,所以只适合结构固定的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:29:50