影刀RPA 网页表格数据采集:解析HTML表格的正确方法

发布时间:2026/7/23 4:20:11

影刀RPA 网页表格数据采集:解析HTML表格的正确方法
影刀RPA 网页表格数据采集解析HTML表格的正确方法作者林焱网页上的表格是结构化数据的重要载体——商品列表、财务报表、订单记录、成绩单。采集表格数据是RPA的高频需求。但很多新手只会逐个单元格获取文本一个10行5列的表格要操作50次慢得要命。而且合并单元格、嵌套表格、动态加载等特殊情况更让人头疼。这篇文章把网页表格数据采集的高效方法讲全。一、获取整个表格1.1 用影刀指令获取影刀提供【获取网页表格】指令可以一次性获取整个表格【获取网页表格】 目标元素定位到table元素 → 输出到变量 table_data二维列表返回的table_data是一个二维列表table_data[0]是第一行table_data[0][1]是第一行第二列。1.2 用JavaScript获取更灵活的方式是用JS直接提取表格数据// 获取表格数据vartabledocument.querySelector(table.data-table);varrowstable.querySelectorAll(tr);vardata[];rows.forEach(function(row){varcellsrow.querySelectorAll(td, th);varrowData[];cells.forEach(function(cell){rowData.push(cell.innerText.trim());});data.push(rowData);});returnJSON.stringify(data);在影刀的【执行JavaScript】指令中运行这段代码返回JSON字符串在Python中解析importjson table_jsonget_variable(js_result)table_datajson.loads(table_json)# table_data是二维列表print(f共{len(table_data)}行{len(table_data[0])}列)1.3 用pandas直接读取HTML表格importpandasaspd# 从HTML字符串读取表格tablespd.read_html(html_string)# 返回所有表格的列表tables[0]是第一个表格# 从URL读取tablespd.read_html(https://example.com/data)dftables[0]# 第一个表格# 从本地HTML文件读取tablespd.read_html(D:\\data\\page.html)dftables[0]# 转成字典列表datadf.to_dict(records)pandas的read_html非常强大它自动解析HTML中的table标签返回DataFrame。适合处理标准HTML表格。店群矩阵自动化突破运营极限二、逐行逐列采集2.1 按行遍历当表格不能一次性获取时如动态加载、需要逐行处理用逐行遍历# 获取所有行rowsget_element_list(//table[iddata-table]//tr)table_data[]forrowinrows:# 获取这一行的所有单元格cellsrow.find_elements_by_css_selector(td, th)row_data[cell.text.strip()forcellincells]table_data.append(row_data)# 第一行是表头headerstable_data[0]datatable_data[1:]2.2 按列获取需要获取某一列的数据# 获取第三列索引2的所有数据column_data[]rowsget_element_list(//table//tr)forrowinrows[1:]:# 跳过表头cellsrow.find_elements_by_css_selector(td)iflen(cells)2:column_data.append(cells[2].text.strip())print(f第三列数据{column_data})2.3 按单元格获取需要精确定位某个单元格# 获取第3行第2列的值cell_valueget_element_text(//table//tr[3]//td[2])# 用XPath精确定位![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/a0139cdf50884dc4830737490c105854.png#pic_center)cell_valueget_element_text(//table[iddata]//tr[3]/td[2])三、处理合并单元格3.1 行合并rowspantabletrtdrowspan2华东/tdtd上海/td/trtrtd杭州/td!-- 第一列被合并了这行只有2个td --/tr/table合并单元格导致某些行少一个td直接遍历会错位。处理方法填充合并的值# 用JS处理合并单元格js_code var table document.querySelector(table); var rows table.querySelectorAll(tr); var data []; // 第一遍收集所有单元格的位置信息 var grid []; for (var r 0; r rows.length; r) { var cells rows[r].querySelectorAll(td, th); var colIndex 0; var rowData []; for (var c 0; c cells.length; c) { // 跳过被合并占据的位置 while (grid[r] grid[r][colIndex]) { rowData.push(grid[r][colIndex]); colIndex; } var cell cells[c]; var text cell.innerText.trim(); rowData.push(text); var rowspan parseInt(cell.getAttribute(rowspan) || 1); var colspan parseInt(cell.getAttribute(colspan) || 1); // 记录合并范围 for (var rs 0; rs rowspan; rs) { if (!grid[r rs]) grid[r rs] []; for (var cs 0; cs colspan; cs) { grid[r rs][colIndex cs] text; } } colIndex colspan; } data.push(rowData); } return JSON.stringify(data); resultexecute_js(js_code)table_datajson.loads(result)3.2 列合并colspantrtdcolspan2合计/td!-- 占两列 --td100/td![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/b26e24ab8dc54e9785feea3dc3a72410.png#pic_center)/tr列合并导致一行中td数量少于列数。处理方法同上用JS填充。3.3 简化方案用pandas处理importpandasaspd# pandas的read_html会自动处理合并单元格tablespd.read_html(html_string,header0)dftables[0]# 合并单元格的值会被填充到所有合并的行/列print(df)四、动态加载的表格4.1 滚动加载表格数据不是一次性加载的滚动到底部才加载更多importtime all_data[]last_height0whileTrue:# 获取当前可见的行rowsget_element_list(//table//tr)forrowinrows:cellsrow.find_elements_by_css_selector(td)row_data[cell.text.strip()forcellincells]ifrow_datanotinall_data:all_data.append(row_data)# 滚动到底部execute_js(window.scrollTo(0, document.body.scrollHeight))time.sleep(2)# 检查是否到底current_heightexecute_js(return document.body.scrollHeight)ifcurrent_heightlast_height:break# 没有新数据了last_heightcurrent_heightprint(f共采集{len(all_data)}行)4.2 翻页表格表格分页显示需要翻页采集all_data[]page1whileTrue:# 采集当前页表格rowsget_element_list(//table//tr)forrowinrows:cellsrow.find_elements_by_css_selector(td)row_data[cell.text.strip()forcellincells]ifrow_data:all_data.append(row_data)print(f第{page}页采集{len(rows)}行累计{len(all_data)}行)# 检查是否有下一页next_btnget_element(//a[classnext-page])ifnotnext_btnordisabledinnext_btn.get_attribute(class):break# 点击下一页next_btn.click()wait_for_element(//table)page1print(f共采集{len(all_data)}行数据)4.3 AJAX加载的表格表格数据通过AJAX请求加载表格HTML是动态生成的。等待表格加载完成后再采集# 触发数据加载click_element(#load-data)# 等待表格行出现wait_for_element(//table//tr,timeout30)# 等待数据加载完成行数不再变化previous_count0whileTrue:current_countexecute_js(return document.querySelectorAll(table tr).length)ifcurrent_countprevious_countandcurrent_count0:breakprevious_countcurrent_count time.sleep(1)# 采集数据rowsget_element_list(//table//tr)五、表格中的链接和按钮5.1 提取单元格中的链接rowsget_element_list(//table//tr)forrowinrows:# 获取单元格文本namerow.find_element_by_css_selector(td:nth-child(1)).text# 获取链接linkrow.find_element_by_css_selector(td:nth-child(2) a)hreflink.get_attribute(href)# 获取链接文本link_textlink.textprint(f{name}:{link_text}→{href})5.2 点击行中的操作按钮rowsget_element_list(//table//tr)forrowinrows:namerow.find_element_by_css_selector(td:nth-child(1)).text statusrow.find_element_by_css_selector(td:nth-child(3)).textifstatus待处理:[video(video-4KIWJsyQ-1784737689307)(type-csdn)(url-https://live.csdn.net/v/embed/524992)(image-https://v-blog.csdnimg.cn/asset/b59aed2f01d4fe8583467562aaf4dcfd/cover/Cover0.jpg)(title-temu店群自动化报活动案例)]# 点击该行的处理按钮btnrow.find_element_by_css_selector(button.process-btn)btn.click()wait_for_element(.process-success)print(f已处理{name})5.3 进入行详情页rowsget_element_list(//table//tr)forrowinrows[1:]:# 跳过表头# 点击行进入详情row.click()wait_for_element(.detail-page)# 采集详情数据detailget_element_text(.detail-content)# 返回列表click_element(.back-button)wait_for_element(//table)print(detail)六、表格数据转Excel6.1 直接写入importpandasaspd# table_data是采集的二维列表headerstable_data[0]datatable_data[1:]dfpd.DataFrame(data,columnsheaders)df.to_excel(D:\\output\\table_data.xlsx,indexFalse)6.2 带格式写入importopenpyxlfromopenpyxl.stylesimportFont,PatternFill,Alignment,Border,Side wbopenpyxl.Workbook()wswb.active ws.title采集数据# 写入数据forrow_idx,row_datainenumerate(table_data,1):forcol_idx,valueinenumerate(row_data,1):ws.cell(rowrow_idx,columncol_idx,valuevalue)# 表头格式header_fontFont(boldTrue,colorFFFFFF)header_fillPatternFill(start_color4472C4,end_color4472C4,fill_typesolid)forcolinrange(1,len(table_data[0])1):cellws.cell(row1,columncol)cell.fontheader_font cell.fillheader_fill cell.alignmentAlignment(horizontalcenter)# 边框thin_borderBorder(leftSide(stylethin),rightSide(stylethin),topSide(stylethin),bottomSide(stylethin))forrowinws.iter_rows(min_row1,max_rowlen(table_data),max_collen(table_data[0])):forcellinrow:cell.borderthin_border# 自适应列宽forcolinrange(1,len(table_data[0])1):max_len0forrowinrange(1,len(table_data)1):valws.cell(rowrow,columncol).valueifval:lengthsum(2iford(c)127else1forcinstr(val))max_lenmax(max_len,length)ws.column_dimensions[openpyxl.utils.get_column_letter(col)].widthmax_len4wb.save(D:\\output\\table_data.xlsx)七、避坑清单坑1表头和数据行数量不一致表头有5列但某些数据行只有4列因为合并单元格或某些列为空。用最大列数对齐max_colsmax(len(row)forrowintable_data)forrowintable_data:whilelen(row)max_cols:![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/ad5633de63984aa29e15ddb384cc4327.png#pic_center)row.append()# 补齐空列坑2表格中有嵌套表格tabletrtdtable.../table!-- 嵌套表格 --/td/tr/table用具体的XPath避免获取到嵌套表格的数据//table[idmain-table]/tbody/tr/td !-- 只获取直接子元素 --坑3表格内容包含HTML标签单元格中可能有br、span等标签innerText会去掉标签只返回文本innerHTML会保留标签。通常用innerText。坑4表格太大数据量大一个表格几千行一次性获取可能超时或内存不足。分页或分段采集。坑5表头不在第一行有些表格前面有标题行或说明行真正的表头在第2或第3行。调整起始行headerstable_data[1]# 第2行是表头datatable_data[2:]# 第3行开始是数据

相关新闻

OpenClaw安装与模型加载问题解决方案

OpenClaw安装与模型加载问题解决方案

2026/7/23 4:20:11

1. OpenClaw安装后的基础检查清单完成OpenClaw的安装后,建议先执行以下基础检查,确保核心组件正常运行:# 检查Ollama服务状态 ollama serve ollama list# 验证OpenClaw模型发现功能 openclaw models list --provider ollama# 运行基础测试命令…

《干词》入选“2026鸿蒙创新精品啦”!

《干词》入选“2026鸿蒙创新精品啦”!

2026/7/23 4:10:11

背单词神器《干词》像素风✨准备:考研/四六级/雅思的快来干词背单词!🔥家人们谁懂啊!昨天团队还在埋头敲代码,突然收到了一封来自华为官方的邮件📩——《干词》竟然正式入选了“华为鸿蒙2026创新精品”&…

Oracle RAC双节点集群部署实战:从环境配置到高可用验证

Oracle RAC双节点集群部署实战:从环境配置到高可用验证

2026/7/23 4:10:11

在企业级数据库架构中,高可用性和负载均衡是核心需求。Oracle Real Application Clusters(RAC)作为Oracle官方提供的集群解决方案,允许多个节点共享同一数据库实例,实现故障自动切换和并发负载均衡。对于需要7x24小时稳…

Godot脚本语言全解析:GDScript、C#与扩展语言选型指南

Godot脚本语言全解析:GDScript、C#与扩展语言选型指南

2026/7/23 5:10:13

1. 项目概述:为什么需要一份Godot脚本语言对比指南?如果你刚开始接触Godot引擎,或者从Unity、Cocos等引擎转过来,面对Godot的脚本语言选择,大概率会有点懵。GDScript、C#、VisualScript,甚至还能用C和第三方…

VC++获取Windows系统路径:从API演进到实战源码解析

VC++获取Windows系统路径:从API演进到实战源码解析

2026/7/23 5:10:13

1. 项目概述:为什么获取系统路径是VC开发者的基本功在Windows平台下进行VC开发,无论是开发桌面应用、系统工具还是游戏,有一个场景几乎无法避免:你需要知道系统把那些关键的文件和目录放在哪里了。是用户的文档文件夹?…

Codex上下文窗口缩减至27.2万token:影响分析与优化策略

Codex上下文窗口缩减至27.2万token:影响分析与优化策略

2026/7/23 5:10:13

最近在开发中使用 OpenAI 的 API 时,不少开发者注意到 Codex 模型的上下文窗口从 37.2 万 token 缩减到了 27.2 万 token。这个变化直接影响到了长代码生成、多文件编程辅助等场景的实用性。本文将从技术角度完整解析上下文窗口的概念、Codex 模型的特点、token 缩减…

文心一言图像生成参数速查手册(含12种场景推荐配置):电商主图/插画/海报/LOGO一键适配参数模板

文心一言图像生成参数速查手册(含12种场景推荐配置):电商主图/插画/海报/LOGO一键适配参数模板

2026/7/23 5:10:13

更多请点击: https://kaifayun.com 第一章:文心一言图像生成参数体系概览 文心一言(ERNIE-ViLG)的图像生成能力依托于一套结构清晰、语义丰富的参数体系,涵盖提示词理解、风格控制、构图约束与质量调节四大维度。该体…

深入解析Cortex-M3 NVIC与PWM模块:嵌入式实时控制的核心机制与API实战

深入解析Cortex-M3 NVIC与PWM模块:嵌入式实时控制的核心机制与API实战

2026/7/23 5:10:13

1. 项目概述在嵌入式实时系统的开发中,中断控制器和PWM模块是两个至关重要的硬件外设,它们直接决定了系统的响应速度和控制精度。中断控制器,特别是Cortex-M3内核集成的嵌套向量中断控制器,是系统实时性的基石,它负责以…

如何用嘎嘎降AI处理信息管理论文:信息管理毕业论文降AI免费4.8元知网达标完整教程

如何用嘎嘎降AI处理信息管理论文:信息管理毕业论文降AI免费4.8元知网达标完整教程

2026/7/23 5:00:13

如何用嘎嘎降AI处理信息管理论文:信息管理毕业论文降AI免费4.8元知网达标完整教程 关于信息管理论文降AI教程,有几个细节提前知道能少走很多弯路。 核心用嘎嘎降AI(www.aigcleaner.com),4.8元,达标率99.2…

微服务进阶:服务网格与Istio

微服务进阶:服务网格与Istio

2026/7/23 3:40:08

541|微服务进阶:服务网格与Istio 上篇文章我们聊了微服务的基本概念和拆分方法。 但微服务多了,问题也多了: 服务之间怎么通信? 怎么监控每个服务的调用链路? 熔断、限流、重试怎么做? 安全认证怎么统一? 以前这些都靠SDK库(比如Hystrix、Feign),每个服务都要集成…

零售超级终端全域协同:ShareKit 碰一碰商品流转业务落地案例

零售超级终端全域协同:ShareKit 碰一碰商品流转业务落地案例

2026/7/23 4:40:05

一、零售门店全域协同业务背景与行业痛点 1.1 门店超级终端设备矩阵(连锁便利店/商超标准配置) 自助收银Kiosk一体机:顾客结算、自助核销优惠券、商品素材预览;运营折叠平板:店长后台商品上新、图片录入、活动配置、…

噗叽短视频界面分析

噗叽短视频界面分析

2026/7/23 1:54:13

1 和小红书类似,可以采用类似判断方法------------其实他比小红书好判断,因为他没有图片,控件位置几乎是固定的,都不用判断------------2 因为他没有点赞按钮------------而且几乎所有控件位置都是完全一样的,所以我就…

企业级AI搜索落地选型实战手册(含LLM+RAG+Hybrid架构对比矩阵与ROI测算模板)

企业级AI搜索落地选型实战手册(含LLM+RAG+Hybrid架构对比矩阵与ROI测算模板)

2026/7/23 0:09:56

更多请点击: https://kaifayun.com 第一章:企业级AI搜索落地选型实战手册(含LLMRAGHybrid架构对比矩阵与ROI测算模板) 企业级AI搜索系统落地成败,核心在于技术选型与业务价值的精准对齐。盲目堆砌大模型能力或过度依赖…

TM4C129LNCZAD外设实战:LCD、比较器与PWM寄存器配置详解

TM4C129LNCZAD外设实战:LCD、比较器与PWM寄存器配置详解

2026/7/23 0:09:56

1. 项目概述与核心价值在嵌入式系统开发,尤其是基于ARM Cortex-M内核的微控制器项目中,深入理解并熟练配置芯片的片上外设,是从“点亮LED”迈向“实现复杂系统功能”的关键一步。Tiva™ TM4C129LNCZAD作为TI公司Cortex-M4F家族中的高性能成员…

AtomCode `fmt_dur` 争议溯源:两个函数、三段演进、四个事实

AtomCode `fmt_dur` 争议溯源:两个函数、三段演进、四个事实

2026/7/23 0:09:56

一、快速声明与争议背景本文是对 AtomCode 终端 spinner 时长显示 fmt_dur 相关说法的事实性核验。2026 年 7 月 CSDN 上出现两篇互相矛盾的博文,近期又有 AI 在对话中输出格式描述 XhYm / YmZs / Zs。本文基于 AtomCode 仓库 main4677ddfa 及全分支 Git 历史给出可…