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}")
关键修改点
- 将XPath开头的
//改为.//,限定查找范围为当前元素的子树内,而非整个页面。 - 不再分开取两个列表配对,而是遍历每个球队时直接在其上下文找对应赔率,彻底避免元素错位问题。
补充提示
- 用浏览器开发者工具(F12)查看页面DOM结构,确认球队与赔率的层级关系,微调相对XPath路径。
- 如果页面存在动态加载,可配合
WebDriverWait等待元素完全加载后再执行爬取,避免漏取数据。
内容的提问来源于stack exchange,提问作者Jezzer
相关产品推荐
相关产品推荐

