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

为何Selenium XPath无法获取Team后的全部元素?求优化写法

解决Selenium XPath无法获取全部'Team'后续元素的问题

看起来你在爬取赛事数据时遇到了XPath定位不全的问题,返回结果里出现了恼人的None值,我来帮你拆解原因并给出优化方案:

为什么会出现None值?

大概率是这几个原因导致的:

  • 元素加载不同步:第二个目标组可能比第一个加载慢,Selenium执行XPath时它还没完全渲染出来,自然找不到元素返回None。
  • XPath范围太宽泛:原语句里的following::div会匹配所有Team节点之后的div,可能某些结构下第二个元素的层级、class和第一个有细微差异(比如多了个active后缀、嵌套层级不同),导致XPath匹配失败。
  • 动态渲染的坑:网站用JS动态生成内容,你的XPath没精准命中动态生成后的节点。

更优的XPath写法及修复方案

1. 缩小XPath匹配范围,用following-sibling代替following

following会匹配所有后续节点,范围太广容易出错。如果MarketGroup是Team所在节点的同级元素,改用following-sibling精准定位相邻的目标组:

xp_bp1 = ".//th[normalize-space(text())='Team']/following-sibling::div[contains(@class, 'MarketGroup')]//table[contains(@class, 'MarketTable MatchMarket')]//tbody//tr[1]//td[1]"

这里加了normalize-space()是为了处理Team文本可能带的空格或换行,避免匹配失败。如果Team的th和MarketGroup不是同级,先回到父容器再找后续:

xp_bp1 = ".//th[normalize-space(text())='Team']/ancestor::tr/following-sibling::tr//div[contains(@class, 'MarketGroup')]//table[contains(@class, 'MarketTable MatchMarket')]//tbody//tr[1]//td[1]"

2. 加显式等待,解决动态加载问题

如果是加载时机的问题,给Selenium加显式等待,确保所有目标元素都渲染完成再抓取:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

# 等待所有目标table加载完成,最长等10秒
wait = WebDriverWait(driver, 10)
target_tables = wait.until(EC.presence_of_all_elements_located(
    (By.XPATH, ".//div[contains(@class, 'MarketGroup')]//table[contains(@class, 'MarketTable MatchMarket')]")
))

# 遍历每个table提取数据
results = []
for table in target_tables:
    # 提取球队、赔率等信息
    team1 = table.find_element(By.XPATH, ".//tbody//tr[1]/td[1]").text
    team2 = table.find_element(By.XPATH, ".//tbody//tr[2]/td[1]").text
    odds = table.find_element(By.XPATH, ".//tbody//tr[1]/td[2]").text
    # 这里根据实际链接元素调整,比如如果链接在table的父级
    link = table.find_element(By.XPATH, "./ancestor::a").get_attribute("href")
    results.append([team1, team2, odds, link])

3. 检查DOM结构,修正匹配逻辑

打开浏览器F12,查看返回None的元素对应的DOM:

  • 确认它的MarketGroup class是否和第一个完全一致(比如是不是MarketGroup active这种带后缀的)
  • 确认table的MarketTable MatchMarket有没有拼写错误或动态添加的class
  • 如果Team的文本是隐藏在子元素里的,比如<th><span>Team</span></th>,要调整XPath为.//th[contains(.//text(),'Team')]

总结

先排查元素加载时机(加显式等待),再优化XPath的精准度(用following-sibling缩小范围),结合实际DOM结构调整路径,应该就能解决None值的问题,拿到你期望的完整数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:05:46