Selenium爬取表格报NoSuchElementException无法定位events_table元素
问题根因
- 驱动与浏览器版本不匹配:本地Chrome实际版本为100.0.4896.127,但
webdriver_manager默认拉取了适配102版本Chrome的驱动,版本不兼容会导致Selenium控制的浏览器实例页面渲染异常,DOM结构和手动打开浏览器看到的不一致,无法定位到目标元素。 - 元素等待逻辑不可靠:目标站点的表格是前端JS异步渲染生成,设置的隐式等待只能在元素查找时做固定轮询,无法精准判断表格是否完全加载完成,页面未渲染完就执行定位就会抛出找不到元素的异常。
- 定位API存在兼容风险:代码中使用的
find_element_by_id属于Selenium旧版API,高版本Selenium中已经被标记为废弃,后续版本会直接移除,运行时也可能出现非预期异常。
修复方案
- 强制指定ChromeDriver版本和本地浏览器版本匹配,避免自动拉取错误版本的驱动。如果自动匹配始终有问题,可以直接手动下载对应版本的ChromeDriver,传入本地驱动路径即可绕开自动安装逻辑。
- 用显式等待替代隐式等待,明确等待目标表格元素加载到DOM树之后再执行后续读取操作,保证元素定位时页面已经完成渲染。
- 替换废弃的元素定位API,使用Selenium官方推荐的
By类方式定位元素,规避兼容问题。
修复后的可运行代码如下:
import pandas as pd from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from webdriver_manager.chrome import ChromeDriverManager target_url = 'https://www.ncei.noaa.gov/access/billions/events' # 指定适配Chrome 100版本的驱动版本,避免版本不匹配 driver = webdriver.Chrome( service=Service(ChromeDriverManager(driver_version="100.0.4896.60").install()) ) driver.maximize_window() driver.get(target_url) # 显式等待最多30秒,直到目标表格加载完成 wait = WebDriverWait(driver, 30) events_table = wait.until(EC.presence_of_element_located((By.ID, "events_table"))) # 读取表格为DataFrame df = pd.read_html(events_table.get_attribute('outerHTML'))[0] # 操作完成关闭浏览器 driver.quit()
补充说明:如果运行时仍提示驱动版本不匹配,可以直接下载100.0.4896.127版本对应系统的ChromeDriver包,将Service()内的参数替换为本地驱动文件的绝对路径即可,不需要依赖webdriver_manager的自动安装逻辑。
内容的提问来源于stack exchange,提问作者newleaf
相关产品推荐
相关产品推荐

