Selenium TimeoutException报错咨询:网页表格提取失败解决方案
Selenium提取表格时TimeoutException错误排查与解决
问题描述
尝试用以下Selenium代码提取网页https://gemelnet.cma.gov.il/views/dafmakdim.aspx中的表格:
from selenium import webdriver import time from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By from webdriver_manager.chrome import ChromeDriverManager from bs4 import BeautifulSoup import pandas as pd from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By from selenium.webdriver.support.wait import WebDriverWait options = webdriver.ChromeOptions() options.add_argument("--no-sandbox") options.add_argument("--disable-gpu") options.add_argument("--window-size=1920x1080") options.add_argument("--disable-extensions") driver = webdriver.Chrome(service=Service(ChromeDriverManager().install())) URL = 'https://gemelnet.cma.gov.il/views/dafmakdim.aspx' driver.get(URL) time.sleep(2) review=WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//input[@id='knisa']"))) review.click() table=WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//div[@class='Aaaa89455bbfe4387b92529246ea52dc6114']//font"))).text() print(table)
运行时触发错误:raise TimeoutException(message, screen, stacktrace) selenium.common.exceptions.TimeoutException: Message:
错误原因分析
- 动态类名导致定位失效:代码中使用的
Aaaa89455bbfe4387b92529246ea52dc6114属于动态生成的类名,页面刷新或加载后会随机变化,XPath无法匹配到目标元素。 - 异步加载未正确等待:点击
knisa按钮后,表格数据可能通过异步请求加载,仅等待单个元素可见无法确保数据完全渲染。 - 语法错误:
.text()是错误写法,Selenium元素的文本属性为.text(不带括号),即使定位到元素也会触发后续报错。
解决建议
改用稳定定位器
打开浏览器开发者工具,找到表格的固定标识(如表格的id、静态类名,或父容器的固定属性)。例如,若表格在固定id的容器内,可调整定位逻辑:# 示例:通过表格标签和父容器固定属性定位 table_element = WebDriverWait(driver, 20).until( EC.visibility_of_element_located((By.XPATH, "//div[@id='固定容器ID']//table")) )优化异步加载等待
点击按钮后,等待表格所有行加载完成,确保数据渲染完毕:review.click() # 等待表格所有行元素出现 table_rows = WebDriverWait(driver, 20).until( EC.presence_of_all_elements_located((By.XPATH, "//table//tr")) ) # 提取所有行文本并拼接 table_content = '\n'.join([row.text for row in table_rows]) print(table_content)修正文本提取语法
将代码中的.text()改为.text,避免属性调用错误。补充页面加载检查
在打开页面后,添加等待页面基础结构加载完成的逻辑:driver.get(URL) # 等待页面body元素加载完成 WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.TAG_NAME, "body")))
内容的提问来源于stack exchange,提问作者developer
相关产品推荐
相关产品推荐

