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

Python+Selenium获取shadow-root内赛事数据报错,求修正方案

解决Selenium获取赛事及赔率的InvalidArgumentException问题

问题根源

你遇到的InvalidArgumentException主要来自两个问题:一是在Shadow DOM中使用了绝对XPath路径,Selenium对Shadow DOM内的XPath查询有上下文限制;二是未等待元素完全加载就执行查询,导致元素尚未就绪。

修正后的代码

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

# 初始化Chrome浏览器
driver = webdriver.Chrome()
driver.get("https://bluechip.io/sport?bt-path=%2Fschedule%3FscheduleSport%3Dsoccer-1")

# 等待Shadow DOM容器加载完成
wait = WebDriverWait(driver, 15)
inner_page_container = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "div#bt-inner-page")))

# 获取Shadow DOM对象
inner_page = inner_page_container.shadow_root

# 等待赛事卡片加载完成(CSS选择器在Shadow DOM内更稳定)
event_cards = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "[data-editor-id='eventCard']")))

# 遍历提取赛事信息
for card in event_cards:
    # 提取球队名称(根据页面实际DOM结构调整选择器)
    team_names = card.find_elements(By.CSS_SELECTOR, ".bt-event-participant-name")
    if len(team_names) >= 2:
        home_team = team_names[0].text.strip()
        away_team = team_names[1].text.strip()
        print(f"赛事: {home_team} VS {away_team}")
    
    # 提取赔率信息
    odds_values = card.find_elements(By.CSS_SELECTOR, ".bt-odds-value")
    if len(odds_values) >= 3:
        home_odd = odds_values[0].text.strip()
        draw_odd = odds_values[1].text.strip()
        away_odd = odds_values[2].text.strip()
        print(f"赔率: 主胜{home_odd} | 平局{draw_odd} | 客胜{away_odd}\n")

# 关闭浏览器
driver.quit()

核心修改说明

  • 等待机制:添加WebDriverWait等待元素加载,避免因页面未渲染完成导致的元素查找失败。
  • 选择器优化:在Shadow DOM内优先使用CSS选择器(兼容性更好),若必须用XPath,需改为相对路径(如.//div[@data-editor-id='eventCard'])。
  • DOM结构适配:页面元素的类名可能随网站更新变化,建议通过浏览器开发者工具查看最新元素结构,调整对应的选择器。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 14:04:58