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

XPath parent::node()未按预期工作的Selenium元素定位问题

问题根因
  • 核心问题是XPath拼接语法错误:你写的contains(., {element})没有给指标名加字符串引号,f-string渲染后XPath会把传入的指标名(比如SO、NO)当成节点名解析,而非要匹配的文本内容,导致匹配逻辑完全失效,始终返回DOM里第一个符合模糊规则的SO₂对应节点,这时候不管你换parent::node()、..还是parent::li都没用,因为一开始定位到的p节点就是错的。
  • 其次是匹配逻辑有歧义:直接用contains()做全节点文本模糊匹配很容易误命中,比如遍历到"PM1"时会同时匹配到"PM10"的节点,遍历到"O"时可能命中所有带O字符的指标,只要顺序不对就会拿错值。
  • 链式多次调用定位方法容错性极差,某一步匹配异常就会直接抛错,也不方便排查问题。
修复方案

优先推荐一次性提取所有指标的方案,完全不用做模糊匹配,从根源上适配页面顺序乱序的问题,性能也更高:

from selenium.webdriver.common.by import By

# 一次性拉取所有污染物指标的li容器
item_list = driver.find_elements(By.CSS_SELECTOR, "ul.sc-hHftDr.gOAyWd li")
pollutant_map = {}

for item in item_list:
    # 直接从每个li里提取对应字段,不用做文本匹配
    indicator_name = item.find_element(By.CSS_SELECTOR, "p.card__subtitle").text.strip()
    indicator_value = item.find_element(By.CSS_SELECTOR, "h1.card__highlight-text").text.strip()
    unit = item.find_element(By.TAG_NAME, "strong").text.strip()
    monitor_time = item.find_elements(By.TAG_NAME, "p")[-1].text.strip()
    pollutant_map[indicator_name] = {
        "value": indicator_value,
        "unit": unit,
        "time": monitor_time
    }

# 后续需要对应指标直接从字典取即可,例如:
# so2_value = pollutant_map.get("SO₂", {}).get("value")
# no2_value = pollutant_map.get("NO₂", {}).get("value")

如果你一定要保留原来循环匹配指标名的写法,注意修正XPath的语法问题,直接一步定位到目标数值节点,不要分多次链式查找:

from selenium.webdriver.common.by import By

elements_name = ['PM10','PM2.5',"PM1","CO","SO","O","NO"]
for element in elements_name:
    # 注意给{element}加单引号,用starts-with做前缀匹配减少误命中,直接定位到h1节点
    value_xpath = f"//ul[@class='sc-hHftDr gOAyWd']//li[p[starts-with(normalize-space(.), '{element}')]]/h1[@class='sc-idOhPF ipvImd card__highlight-text']"
    try:
        value = driver.find_element(By.XPATH, value_xpath).text.strip()
        # 对应存入你的字段即可
    except:
        # 页面不存在该指标时的容错逻辑
        value = None

注:旧版Selenium的find_element_by_*系列方法已经在高版本废弃,建议统一使用find_element(By.xxx, 定位表达式)的写法。

内容的提问来源于stack exchange,提问作者dalia ahmed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 08:24:15