Oddsportal开盘赔率提取问题:Selenium无法定位tooltipdiv元素
解决Oddsportal悬停tooltip无法定位的问题
问题核心
Oddsportal的tooltipdiv是动态生成的悬浮元素,原代码存在驱动冗余、headless模式交互兼容性差、定位逻辑不严谨、等待机制不稳定等问题,导致悬停后无法捕获目标元素。
修复方案
1. 清理冗余驱动初始化
原代码同时初始化wd和driver两个Chrome实例,会造成资源浪费和逻辑冲突,仅保留一个驱动实例即可。
2. 优化Headless模式配置
默认Headless模式对交互效果支持有限,添加参数模拟真实浏览器环境:
chrome_options.add_argument("--window-size=1920,1080") chrome_options.add_argument("--disable-gpu") chrome_options.add_argument("--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36") chrome_options.add_argument('--headless=new') # 启用新版Headless,提升交互兼容性
3. 用显式等待替代固定Sleep
固定sleep无法适配页面加载波动,改用WebDriverWait精准等待元素状态:
- 等待目标赔率单元格加载完成
- 悬停后等待
tooltipdiv出现再定位
4. 简化元素定位逻辑
原定位路径嵌套过深且XPath存在歧义,简化定位表达式提升稳定性:
- 目标单元格:
//table[@class='table-main detail-odds sortable']/tbody/tr[1]/td[2] - Tooltip元素:直接通过ID定位
完整修复代码
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver import ActionChains from selenium import webdriver import warnings warnings.filterwarnings("ignore") # 配置Chrome选项 chrome_options = webdriver.ChromeOptions() chrome_options.add_argument('--headless=new') chrome_options.add_argument('--no-sandbox') chrome_options.add_argument('--disable-dev-shm-usage') chrome_options.add_argument("--window-size=1920,1080") chrome_options.add_argument("--disable-gpu") chrome_options.add_argument("--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36") # 初始化单个驱动实例 driver = webdriver.Chrome(options=chrome_options) driver.get('https://www.oddsportal.com/soccer/brazil/serie-b/gremio-cruzeiro-WhMMpc7f/') try: # 等待目标赔率单元格加载完成 target_element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.XPATH, "//table[@class='table-main detail-odds sortable']/tbody/tr[1]/td[2]")) ) # 执行悬停操作 hover = ActionChains(driver).move_to_element(target_element) hover.perform() # 等待tooltipdiv出现并获取内容 tooltip = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, 'tooltipdiv')) ) print("Tooltip内容:", tooltip.text) finally: driver.quit()
额外提示
- 若仍无法触发tooltip,可临时去掉
--headless参数测试,排查是否为反爬机制限制 - 定期检查Oddsportal页面结构,网站DOM更新可能导致定位表达式失效
内容的提问来源于stack exchange,提问作者Om Prakash Panda
相关产品推荐
相关产品推荐

