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

如何使用BeautifulSoup在重复出现的指定标签中定位目标数值(以查找bdi标签中的280为例)

解决BeautifulSoup定位重复标签中目标数字的问题

嘿,我来帮你搞定这两个问题!先从通用方法说起,再针对性解决你的bdi标签找280的问题。

一、通用方法:在重复HTML标签中定位目标数字

依赖固定索引(比如你用的[4])是很容易踩坑的,因为页面结构可能随时变化,标签的顺序或数量一变,索引就失效了。更可靠的方式有这些:

  • 根据标签上下文定位:比如目标标签的父元素、兄弟元素有没有独特的class/id或文本,先找到上层容器,再定位内部的目标标签。
  • 遍历筛选:把所有目标标签找出来,逐个检查文本内容,匹配你要的数字。
  • 利用标签自身属性:如果目标标签有唯一的class、id或其他属性,直接用这些属性精准定位。

二、针对你的场景:定位bdi标签中的280

你用findAll('bdi')[4]拿到199、340,说明这个索引对应的不是你要的那个bdi标签,大概率是页面中bdi的顺序和你预期的不一样。试试这几个解决方案:

方案1:遍历所有bdi标签,筛选出数值280

直接遍历所有bdi标签,检查每个标签的文本是否等于280,这种方法最直接,适合你明确知道目标数值的情况:

def get_target_price():
    # 遍历所有bdi标签
    for bdi_tag in soup.find_all('bdi'):
        # 先去除文本前后的空格(避免页面有多余空格导致匹配失败)
        price_text = bdi_tag.get_text().strip()
        if price_text == '280':
            return price_text
    # 如果没找到目标数值,返回None或者自定义提示
    return None

方案2:通过父容器精准定位

如果280所在的bdi标签有一个独特的父元素(比如某个带特定class的div),先定位父容器再找bdi,这样能避免干扰其他bdi标签:
比如假设目标bdi在class为"item-price-container"的div里:

def get_target_price():
    # 先找到目标父容器
    price_container = soup.find('div', class_='item-price-container')
    if price_container:
        # 在父容器内找bdi标签
        target_bdi = price_container.find('bdi')
        if target_bdi:
            return target_bdi.get_text().strip()
    return None

方案3:利用bdi标签的自身属性

如果目标bdi标签有自己的独特属性(比如class或id),直接用这些属性定位:
比如目标bdi的class是"current-price":

def get_target_price():
    target_bdi = soup.find('bdi', class_='current-price')
    if target_bdi:
        return target_bdi.get_text().strip()
    return None

小提醒

以后尽量不要用固定索引来定位标签,页面结构稍微变动(比如新增了一个bdi标签),你的代码就会拿到错误的结果。用上下文、属性或者内容筛选的方式,代码会更健壮哦!

内容的提问来源于stack exchange,提问作者Saad OL

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 21:24:06