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

如何使用Python的BeautifulSoup获取div中的第二个span元素

如何提取目标div中的第二个span元素文本?

我懂你现在的困扰——你想抓取每个指定class的div里的第二个span内容,但试了几种方法要么拿到一堆拼接的文本,要么只输出第一个span的内容。咱们来解决这个问题,针对你的HTML结构和现有代码,给你几个可行的方案:

方案1:通过find_all获取span列表后取第二个元素

你的每个目标div里明确有两个span,所以可以先获取div下所有span的列表,再取索引为1的元素(Python列表是0起始):

time = soup.find_all('div', {'class': 'C(#959595) Fz(11px) D(ib) Mb(6px)'})
for div in time:
    spans = div.find_all('span')
    # 先判断是否存在第二个span,避免索引越界报错
    if len(spans) >= 2:
        print(spans[1].text.strip())

这里加了strip()是为了去除文本前后可能存在的多余空格,让输出更干净。

方案2:用CSS选择器直接定位第二个span

BeautifulSoup支持CSS选择器,我们可以直接写出定位第二个子span的规则,一步到位:

# 注意class里的特殊字符(#、())需要用反斜杠转义
target_spans = soup.select('div.C\(\#959595\)\.Fz\(11px\)\.D\(ib\)\.Mb\(6px\) > span:nth-of-type(2)')
for span in target_spans:
    print(span.text.strip())

解释:> span:nth-of-type(2)表示选中div的直接子元素里的第二个span,这样不需要再遍历div,直接拿到所有目标span。

方案3:遍历div子元素筛选第二个span

如果你想更细致地控制遍历过程,可以逐个检查div的子元素,计数找到第二个span:

time = soup.find_all('div', {'class': 'C(#959595) Fz(11px) D(ib) Mb(6px)'})
for div in time:
    span_counter = 0
    for child in div.children:
        # 只处理span标签
        if child.name == 'span':
            span_counter += 1
            if span_counter == 2:
                print(child.text.strip())
                break  # 找到目标就停止遍历子元素

为什么你之前的方法不行?

  • i.span只会返回div下的第一个span元素,所以只能拿到VALUE 1;
  • i.text会把div下所有子元素的文本(包括中间的•符号)拼接在一起,导致输出混乱。

上面的几个方案都能精准定位到你需要的第二个span内容,你可以根据自己的习惯选择使用~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 11:12:41