点击按钮提取KLSE Screener网页表格失败,求技术解决方案
问题排查与修复方案
核心问题分析
你的代码主要存在以下几个问题:
- 绝对XPATH定位不稳定:使用
/html开头的绝对路径定位按钮和表格,页面结构稍有变化就会失效,这是导致执行失败的核心原因。 - 等待条件不严谨:仅等待表格元素存在,未确保其可见且数据已加载完成,容易出现提取空数据的情况。
- 表格数据提取逻辑有误:通过
table-responsive容器直接提取行,但实际数据在容器内的<table>标签中,层级处理错误。
修复后的代码
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from bs4 import BeautifulSoup import pandas as pd # 初始化浏览器并配置优化项 options = webdriver.ChromeOptions() options.add_argument("--start-maximized") # 最大化窗口避免元素被遮挡 driver = webdriver.Chrome(options=options) driver.get("https://www.klsescreener.com/v2/") try: # 改用稳定方式定位筛选按钮(按属性组合定位) filter_button = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.CSS_SELECTOR, 'input[type="submit"][value="筛选"]')) ) filter_button.click() # 等待表格容器可见,确保数据加载完成 table_container = WebDriverWait(driver, 15).until( EC.visibility_of_element_located((By.CLASS_NAME, "table-responsive")) ) # 解析页面提取表格数据 soup = BeautifulSoup(driver.page_source, "html.parser") table = soup.select_one(".table-responsive table") # 正确定位容器内的table标签 # 提取表头 header = [th.get_text(strip=True) for th in table.select("thead tr th")] # 提取数据行 data_rows = [] for row in table.select("tbody tr"): row_data = [td.get_text(strip=True) for td in row.find_all("td")] if row_data: # 跳过空行 data_rows.append(row_data) # 生成DataFrame并保存 df = pd.DataFrame(data_rows, columns=header) df.to_excel("klse_table.xlsx", index=False) print("表格数据已成功保存到klse_table.xlsx") finally: # 确保浏览器正常关闭 driver.quit()
关键优化点说明
- 稳定元素定位:用CSS选择器按按钮的
type和value属性组合定位,替代脆弱的绝对XPATH,适配页面结构的小幅度变化。 - 严谨等待逻辑:使用
element_to_be_clickable确保按钮可点击,visibility_of_element_located确保表格可见且数据加载完成,延长等待时间应对网络延迟。 - 修正数据提取层级:明确获取
table-responsive容器内的<table>标签,区分表头(thead)和数据行(tbody),避免提取到无关的空行或表头重复行。 - 异常安全处理:用
try-finally块包裹核心逻辑,确保无论执行是否出错,浏览器都会正常关闭,避免资源泄漏。
内容的提问来源于stack exchange,提问作者梁翃強
相关产品推荐
相关产品推荐

