如何使用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
相关产品推荐
相关产品推荐

