如何用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
相关产品推荐
相关产品推荐

