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

Selenium Python爬取odds ng-star-inserted类div出现重复值如何解决

问题核心原因

  1. XPath全局搜索问题:代码中//div[@class="game g2 ng-star-inserted"]以//开头,代表从整个HTML文档根节点搜索匹配元素,每次循环都会优先返回第一场赛事的对应节点,所以永远拿到1.30、2.30这组值。
  2. 节点索引匹配错误:你需要的目标赔率属于每个赛事下的第三个game节点,原有循环的判断条件、节点搜索范围都不匹配。
  3. 循环拆分导致长度不匹配:单独拆分赛事和赔率的遍历循环,很容易出现两个数组长度不一致的问题,就是你遇到的ValueError: All arrays must be of the same length报错。

修改后的代码

teams = []
btts = []

box = driver.find_element(By.XPATH, '//*[@id="page"]/div[2]')
sport_title = box.find_element(By.CLASS_NAME, 'sport-name')
parent = sport_title.find_element(By.XPATH, './..')
grandparent = parent.find_element(By.XPATH, './../..')  # 简化多层父节点查找
single_row_events = grandparent.find_elements(By.CLASS_NAME, 'event')

for match in single_row_events:
    # 提取队伍名称
    for team in match.find_elements(By.CLASS_NAME, 'rivals'):
        teams.append(team.text.strip())
    # 直接提取当前赛事的目标赔率:用.开头的相对路径,仅搜索当前match节点内的元素
    target_game = match.find_element(By.XPATH, './/div[@class="game g2 ng-star-inserted"]')
    odds = [o.text.strip() for o in target_game.find_elements(By.CLASS_NAME, 'odds')]
    btts.append('\n'.join(odds))

# 输出结果
for t, o in zip(teams, btts):
    print(f"{t} {o}", end=" ")

代码修改说明

  • 把赔率提取逻辑整合到赛事遍历循环内,避免两个列表长度不匹配的问题
  • 用.开头的相对XPath路径,限定只在当前赛事节点内搜索元素,不会拿到其他赛事的数值
  • 直接定位class="game g2 ng-star-inserted"的目标节点,精准提取对应两个赔率值

运行后即可得到预期输出:Netherlands\nSouth Korea 1.30\n2.30 Germany\nJapan 1.31\n2.31

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 02:54:07