Selenium获取交互式页面源码后,提取JS表格数据并导出CSV
解决方法:用Selenium提取动态生成的JS数组并导出为CSV
我太懂你的困扰了——ASPX这类交互式网站的动态数据根本不会出现在静态源码里(就是你按Ctrl+U看到的内容),因为表格数据是通过JavaScript动态计算后存在theCols和theRows数组里的。下面是完整的实现步骤和代码,帮你搞定这个问题:
核心思路
- 用Selenium模拟真实浏览器操作,完成下拉框选择、查询点击,确保页面完全渲染并生成目标JS数组。
- 通过Selenium的
execute_script方法直接从浏览器的全局作用域中提取theCols和theRows变量(这是关键!静态源码里根本拿不到这些动态生成的数据)。 - 将提取到的表头(
theCols)和行数据(theRows)转换为CSV格式导出。
完整代码示例
from selenium import webdriver from selenium.webdriver.support.ui import Select from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By import csv import time # 初始化Chrome浏览器(换成Firefox等也可以,对应改驱动就行) driver = webdriver.Chrome() driver.get("你的目标ASPX网站URL") try: # 1. 处理下拉框选择(替换成你实际页面的下拉框定位器) # 先等下拉框加载出来 dropdown = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "你的下拉框ID")) ) select = Select(dropdown) # 这里可以按索引、值或可见文本选,比如选指定文本的选项 select.select_by_visible_text("你需要的选项文本") # 2. 点击查询按钮(替换成你实际的查询按钮定位器) query_btn = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.ID, "查询按钮的ID")) ) query_btn.click() # 3. 等待目标JS数组加载完成(重中之重!确保theCols和theRows已经生成) WebDriverWait(driver, 15).until( lambda d: d.execute_script("return typeof window.theCols !== 'undefined' && typeof window.theRows !== 'undefined'") ) # 保险起见再等1秒,防止数据还在后台处理 time.sleep(1) # 4. 从浏览器内存中提取JS数组数据 the_cols = driver.execute_script("return window.theCols") the_rows = driver.execute_script("return window.theRows") # 5. 导出为CSV文件 with open("aspx_table_data.csv", "w", newline="", encoding="utf-8") as csvfile: writer = csv.writer(csvfile) # 写入表头 writer.writerow(the_cols) # 写入所有行数据 writer.writerows(the_rows) print("CSV文件导出成功!可以去当前目录查看结果啦") finally: # 不管成功失败,最后都关闭浏览器 driver.quit()
关键细节说明
- 为什么Ctrl+U没用? 因为ASPX的静态源码只是初始的HTML框架,
theCols和theRows是你点击查询后,浏览器通过JS动态计算生成并存在内存里的,只有通过浏览器的执行环境才能拿到这些数据。 - 等待机制:一定要用
WebDriverWait等待元素和JS变量加载完成,别用固定的time.sleep,这样代码更稳定,不会因为网络慢或者页面卡出问题。 - 元素定位:你需要把代码里的下拉框ID、查询按钮ID替换成你实际网站的元素定位器——可以用Chrome开发者工具的元素选择器直接复制。
- 编码问题:如果导出的CSV有乱码,把
encoding参数改成gbk或者其他适合你数据的编码就行。
内容的提问来源于stack exchange,提问作者Hermes2
相关产品推荐
相关产品推荐

