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

Selenium爬取表格报NoSuchElementException无法定位events_table元素

问题根因
  • 驱动与浏览器版本不匹配:本地Chrome实际版本为100.0.4896.127,但webdriver_manager默认拉取了适配102版本Chrome的驱动,版本不兼容会导致Selenium控制的浏览器实例页面渲染异常,DOM结构和手动打开浏览器看到的不一致,无法定位到目标元素。
  • 元素等待逻辑不可靠:目标站点的表格是前端JS异步渲染生成,设置的隐式等待只能在元素查找时做固定轮询,无法精准判断表格是否完全加载完成,页面未渲染完就执行定位就会抛出找不到元素的异常。
  • 定位API存在兼容风险:代码中使用的find_element_by_id属于Selenium旧版API,高版本Selenium中已经被标记为废弃,后续版本会直接移除,运行时也可能出现非预期异常。
修复方案
  1. 强制指定ChromeDriver版本和本地浏览器版本匹配,避免自动拉取错误版本的驱动。如果自动匹配始终有问题,可以直接手动下载对应版本的ChromeDriver,传入本地驱动路径即可绕开自动安装逻辑。
  2. 用显式等待替代隐式等待,明确等待目标表格元素加载到DOM树之后再执行后续读取操作,保证元素定位时页面已经完成渲染。
  3. 替换废弃的元素定位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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 12:09:27