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

点击按钮提取KLSE Screener网页表格失败,求技术解决方案

问题排查与修复方案

核心问题分析

你的代码主要存在以下几个问题:

  1. 绝对XPATH定位不稳定:使用/html开头的绝对路径定位按钮和表格,页面结构稍有变化就会失效,这是导致执行失败的核心原因。
  2. 等待条件不严谨:仅等待表格元素存在,未确保其可见且数据已加载完成,容易出现提取空数据的情况。
  3. 表格数据提取逻辑有误:通过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,提问作者梁翃強

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 16:55:17