使用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
相关产品推荐
相关产品推荐

