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

Selenium无法点击type=button按钮问题求助(附目标网站)

解决Selenium点击"Load All"按钮及提取表格数据问题

1. 定位按钮报错的原因及修复

你触发InvalidSelectorException是因为By.CLASS_NAME不支持传入多个空格分隔的类名(按钮class是" primary load-all btn btn-",包含多个独立类)。改用以下两种定位方式即可:

方式一:CSS选择器(推荐)

利用多类选择器匹配按钮:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 等待按钮可点击(显式等待避免元素未加载)
load_all_btn = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.CSS_SELECTOR, "button.primary.load-all.btn"))
)
load_all_btn.click()

方式二:XPATH(通过按钮文本定位)

如果类名有变动风险,用文本定位更稳定:

load_all_btn = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((By.XPATH, "//button[contains(span/text(), 'Load All')]"))
)
load_all_btn.click()

2. 提取Month和PRIORSETTLE列数据

按钮加载完所有数据后,定位表格并提取目标列:

import pandas as pd

# 等待表格加载完成
table = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.CSS_SELECTOR, "table.cme-datatable"))
)

# 获取表头,确定目标列的索引
headers = [header.text.strip() for header in table.find_elements(By.TAG_NAME, "th")]
month_idx = headers.index("Month")
prior_settle_idx = headers.index("PRIORSETTLE")

# 遍历表格行提取数据
rows = table.find_elements(By.TAG_NAME, "tr")[1:]  # 跳过表头行
result = []
for row in rows:
    cells = row.find_elements(By.TAG_NAME, "td")
    # 确保行有足够的单元格
    if len(cells) > max(month_idx, prior_settle_idx):
        result.append({
            "Month": cells[month_idx].text.strip(),
            "PRIORSETTLE": cells[prior_settle_idx].text.strip()
        })

# 转为DataFrame并导出(可选)
df = pd.DataFrame(result)
df.to_csv("gasoil_data.csv", index=False)
print(df)

关键注意点

  • 必须使用显式等待(WebDriverWait),避免页面未加载完成就执行操作
  • 确保ChromeDriver版本与本地Chrome浏览器版本一致,否则会出现兼容性问题
  • 若网站有反爬限制,可适当添加time.sleep()或配置ChromeOptions(如禁用图片、启用无头模式)

内容的提问来源于stack exchange,提问作者Adii

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 17:25:29