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

使用Selenium+Python抓取悬停弹窗数据遇NoSuchElementException报错

问题修复方案

核心错误原因

  • 绝对路径XPath稳定性极低:全路径XPath完全依赖DOM层级结构,页面异步加载内容、动态插入节点都会导致路径失效
  • 类选择规则错误:你报错中出现的.right odds是错误的多类选择写法,多类名匹配需要用.right.odds.up,空格代表后代选择,会误匹配.right节点下的<odds>标签,自然找不到元素
  • 缺少显式等待逻辑:赔率表格是异步渲染的,未等待元素加载完成就直接定位会触发元素不存在错误
  • 悬浮数据获取逻辑错误:悬停弹出的气泡是独立的全局DOM节点,不存在于你定位的td元素内部,所以从原元素拿innerHTML不可能拿到气泡数据

修正后的可运行代码

from selenium import webdriver
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import re

url = 'https://www.oddsportal.com/tennis/czech-republic/wta-ostrava/dodin-oceane-linette-magda-h4MPchI4/'

# 火狐配置根据自己的环境修改
fp = webdriver.FirefoxProfile('/Users/Frontwing/Library/Application Support/Firefox/Profiles/zku6ulmv.ProxyTest')
driver = webdriver.Firefox(executable_path="config/geckodriver",firefox_profile=fp)
driver.get(url)
# 全局等待超时时间设为10秒
wait = WebDriverWait(driver, 10)

def get_cash_data():
    # 用相对XPath定位目标元素,根据类名+内容匹配,稳定性远高于绝对路径
    # 如果要匹配所有赔率单元格,去掉[contains(text(), '2.42')]即可
    target_xpath = "//td[contains(@class, 'odds up')]/div[contains(text(), '2.42')]"
    # 等待元素可交互
    target_ele = wait.until(EC.element_to_be_clickable((By.XPATH, target_xpath)))
    # 滚动到元素居中可见
    driver.execute_script("arguments[0].scrollIntoView({block: 'center'});", target_ele)
    # 执行悬停,加短暂停顿确保气泡触发
    ActionChains(driver).move_to_element(target_ele).pause(0.5).perform()
    
    # 等待悬浮气泡加载完成,oddsportal的气泡通用选择器如下,可根据实际DOM调整
    tooltip_xpath = "//div[contains(@class, 'tooltip') or @id='tooltip']"
    tooltip_ele = wait.until(EC.visibility_of_element_located((By.XPATH, tooltip_xpath)))
    hover_data = tooltip_ele.get_attribute("innerHTML")

    # 提取数据逻辑
    b = re.split('<br>', hover_data)
    print(hover_data)
    return b

get_cash_data()
# 操作完成后关闭驱动
# driver.quit()

额外优化建议

  • 如果需要批量获取所有赔率单元格的悬浮数据,可先通过find_elements拿到所有赔率div元素,循环执行悬停+拿气泡数据的逻辑即可
  • 若遇到气泡闪烁获取不到数据的情况,可适当延长ActionChains的pause时间到1-2秒
  • 尽量不要用绝对路径XPath,优先用类名、属性、文本内容做相对定位,兼容性更强

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 08:24:03