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

如何用Selenium提取HTML中的482,221并保存至Excel/CSV?遇超时异常

解决Selenium超时异常并提取目标数值保存至Excel/CSV

问题背景

需求:使用Selenium提取页面中每小时更新的数值(如482,221),并保存至Excel或CSV文件。目标元素HTML结构如下:

<td style="background-color:WhiteSmoke;min-width: 30.88mm;WIDTH:33.00mm;" class="Ac0548bab133f492498af53b0b728b012111c">
    <div style="word-wrap:break-word;white-space:pre-wrap;" class="Ac0548bab133f492498af53b0b728b012111">482,221</div>
</td>

尝试过XPath、CSS选择器、类名三种定位方式,均触发TimeoutException。

超时原因排查

常见触发该异常的原因:

  • 目标元素嵌套在iframe中,未切换上下文
  • 元素的类名是动态生成的(长串随机字符),页面刷新后类名变化
  • 超时时间设置过短,页面/元素加载未完成
  • 使用presence_of_element_located仅等待元素存在,但元素实际未可见

解决步骤

1. 检查并切换iframe上下文

如果目标元素在iframe内,必须先切换到iframe再定位:

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

# 等待iframe加载完成并切换
iframe = WebDriverWait(driver, 15).until(
    EC.presence_of_element_located((By.TAG_NAME, "iframe"))
)
driver.switch_to.frame(iframe)

# 之后再执行元素定位逻辑

2. 更换稳定的定位规则

避免依赖动态类名,改用元素的固定样式属性定位:

# 使用XPath结合固定样式属性定位可见元素
element = WebDriverWait(driver, 20).until(
    EC.visibility_of_element_located((
        By.XPATH, 
        "//td[contains(@style,'background-color:WhiteSmoke') and contains(@style,'WIDTH:33.00mm')]/div"
    ))
)
target_value = element.text.strip()

如果数值格式固定(如带千分位逗号的数字),也可以用文本匹配定位:

element = WebDriverWait(driver, 20).until(
    EC.visibility_of_element_located((
        By.XPATH, 
        "//div[matches(text(),'^\\d{1,3},\\d{3}$')]"
    ))
)

3. 遍历元素筛选备选方案

如果上述定位都失效,可遍历页面中所有td元素,筛选符合样式的目标:

td_elements = WebDriverWait(driver, 15).until(
    EC.presence_of_all_elements_located((By.TAG_NAME, "td"))
)
target_value = None
for td in td_elements:
    style_attr = td.get_attribute("style")
    if "background-color:WhiteSmoke" in style_attr and "WIDTH:33.00mm" in style_attr:
        div_element = td.find_element(By.TAG_NAME, "div")
        target_value = div_element.text.strip()
        break

保存数值至文件

保存到CSV(无需额外依赖)

import csv
from datetime import datetime

# 追加模式写入,保留历史记录
with open("hourly_values.csv", "a", newline="", encoding="utf-8") as f:
    writer = csv.writer(f)
    # 添加时间戳记录更新时间
    current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    writer.writerow([current_time, target_value])

保存到Excel(需安装openpyxl)

from openpyxl import Workbook, load_workbook
from datetime import datetime

try:
    # 读取已有文件
    wb = load_workbook("hourly_values.xlsx")
    ws = wb.active
except FileNotFoundError:
    # 文件不存在则创建新工作簿并写入表头
    wb = Workbook()
    ws = wb.active
    ws.append(["更新时间", "数值"])

# 写入当前数据
current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
ws.append([current_time, target_value])
wb.save("hourly_values.xlsx")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 09:14:53