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

Selenium爬取MLB博彩网站时赔率返回空值问题求助

问题

我用Selenium爬取MLB球队名称和对应赔率时,前6条数据正常,但之后赔率开始缺失并交替出现。

原代码

url = 'https://www.oddschecker.com/us/baseball/mlb'
parent_element = driver.find_element(By.XPATH, '//div[@class="S7oyZN"]')

games = parent_element.find_elements(By.XPATH, '//div[@class="_2tehgH"]')
scores = parent_element.find_elements(By.XPATH, '//div[@data-testid="odds-primary"]')


for game, score in zip(games, scores):
    print(f"{game.text}: {score.text}")

原返回结果

Boston Red Sox: -107
@ Tampa Bay Rays: -115
Cincinnati Reds: +102
@ Atlanta Braves: +123
Seattle Mariners: -120
@ Chicago Cubs: -117
New York Yankees: 
@ Cleveland Guardians: 
Oakland Athletics: 
@ Baltimore Orioles: -107
Houston Astros: 
@ Pittsburgh Pirates: -115
Miami Marlins: 
@ Philadelphia Phillies: +155

etc etc. 

原因分析

你写的XPath用了//,这是全局查找语法——哪怕从parent_element调用,也会返回整个页面中符合条件的元素,而非仅parent_element的子元素。这会导致games和scores的元素数量不匹配,对应关系直接错位,部分球队找不到对应的赔率元素,最终出现空值。

另外,页面结构中每支球队的赔率是和球队绑定在同一父容器内的,分开取两个列表再强行配对,本身就容易因为元素数量不一致出问题。

修复方案

改为按每个球队元素的上下文遍历,直接在球队元素的父/同级节点中查找对应赔率,确保一一对应:

url = 'https://www.oddschecker.com/us/baseball/mlb'
parent_element = driver.find_element(By.XPATH, '//div[@class="S7oyZN"]')

# 用相对路径(.//)在parent_element内部查找球队元素,避免全局匹配
games = parent_element.find_elements(By.XPATH, './/div[@class="_2tehgH"]')

for game in games:
    # 根据页面实际结构调整相对路径,示例为找当前球队父节点下的赔率元素
    score = game.find_element(By.XPATH, './../div[@data-testid="odds-primary"]')
    print(f"{game.text}: {score.text}")

关键修改点

  1. 将XPath开头的//改为.//,限定查找范围为当前元素的子树内,而非整个页面。
  2. 不再分开取两个列表配对,而是遍历每个球队时直接在其上下文找对应赔率,彻底避免元素错位问题。

补充提示

  • 用浏览器开发者工具(F12)查看页面DOM结构,确认球队与赔率的层级关系,微调相对XPath路径。
  • 如果页面存在动态加载,可配合WebDriverWait等待元素完全加载后再执行爬取,避免漏取数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 03:42:48