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

Python Selenium如何根据span标签文本提取对应div元素内容

问题场景

提取Blinkit商品页产品详情模块数据时,因模块为非结构化元素,两类原有方案均无法稳定通用:

  • 固定索引方案:通过XPath拿到所有属性值div后,按固定下标取保质期、产地等信息,不同商品页属性顺序变动时直接取错值。
  • 自定义XPath方案:手写的定位语句运行抛出NoSuchWindowException异常,无法拿到目标值。
问题原因
  1. 固定索引方案本质是依赖所有商品页的属性排列顺序完全一致,没有容错性,非结构化页面下必然失效。
  2. 报错的XPath存在两个硬伤:
    • 语法错误:路径里//div[[多写了一层左方括号,不符合XPath语法规范
    • 逻辑错误:直接在属性值div里匹配"Shelf Life"文本,没有关联属性名标签和对应值标签的层级关系,且硬编码了带随机后缀的完整class名,页面发版后类名变动就会定位失败。
正确实现代码

核心逻辑:先定位到带目标属性名的文本标签,向上找到单条属性的父级容器,再在容器内匹配对应的属性值节点,不依赖属性顺序、不硬编码易变动的随机类名后缀。

from selenium.webdriver.common.by import By

def get_attr_value(wd, attr_name):
    # 匹配逻辑:
    # 1. 找到文本包含目标属性名的标签,用normalize-space过滤多余空格换行
    # 2. 向上查找最近的产品属性单条容器
    # 3. 在容器内查找属性值对应的描述div,只匹配类名中稳定的业务前缀
    xpath = f"//*[contains(normalize-space(text()), '{attr_name}')]/ancestor::div[contains(@class, 'ProductAttribute__ProductAttributes')][1]//div[contains(@class, 'ProductAttribute__ProductAttributesDescription')]"
    return wd.find_element(By.XPATH, xpath).text.strip()

# 调用示例
shelf_life = get_attr_value(wd, "Shelf Life")
country_of_origin = get_attr_value(wd, "Country of Origin")
注意事项
  • 不要硬编码类似lnLDYa的类名片段,这类是前端编译生成的随机哈希值,页面迭代后会频繁变动,只保留类名里带业务语义的稳定前缀即可。
  • 文本匹配优先用normalize-space()处理,避免标签内存在缩进、换行、多余空格导致匹配失败。
  • 不要在属性值节点里直接匹配属性名文本,属性名和属性值是兄弟/堂兄弟节点关系,不是包含关系。

内容的提问来源于stack exchange,提问作者yash agarwal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 17:09:25