影刀RPA新手教程:表格数据批量提取完全指南——网页table、动态列表、无限滚动全攻略
作者:林焱 | 表格数据采了三年,各种坑都踩过
写在前面
表格数据批量提取,是影刀RPA最常用也最容易出问题的场景。
网页表格有标准table标签的,有div模拟的,有无限滚动的,有点击"加载更多"的。
不同结构用不同方法,选错了就是数据采不全或者采到重复数据。
我做过一个电商价格监控项目,光表格采集这块就迭代了四个版本才稳定。
这篇文章把各种表格类型的采集方法全部讲透,附带完整代码和实战案例。
模块一:安装与指令入口
表格数据提取的核心指令在指令区的"网页自动化"分类下面。
最重要的两个指令是:“获取相似元素列表"和"获取元素文本”。
"获取相似元素列表"用来批量捕获表格里同类型的元素,比如所有行的第一列。
"获取元素文本"用来读取单个元素的文本内容。
还有一个重要指令:"数据表"相关指令,在"数据表"分类下面。
用来创建内存中的数据表,把采集到的数据存进去,最后导出Excel。
我当时踩过一个坑:采集到的数据直接打印,没有存数据表,流程一停数据全没了。
后来学乖了:所有采集到的数据,第一时间存数据表,流程结束再统一导出。
模块二:元素定位——表格结构的判断与XPath编写
在采集表格数据之前,必须先分析表格的DOM结构。
按F12打开开发者工具,用元素选择器点选表格中的一个单元格。
标准表格结构(table > tr > td):
<table><tr><td>商品A</td><td>199元</td></tr><tr><td>商品B</td><td>299元</td></tr></table>XPath定位所有商品名称(第一列):
//table//tr//td[1]div模拟的表格:
<divclass="table-row"><divclass="cell">商品A</div><divclass="cell">199元</div></div>XPath定位所有商品名称:
//div[@class='table-row']//div[@class='cell'][1]带表头的表格:
表头在thead里,数据在tbody里,XPath要注意排除表头行。
//table//tbody//tr//td[1]正则配合XPath过滤数据:
有些单元格里混入了不需要的文本,可以用正则先提取再存储。
比如价格文本是"¥199.00 起",用正则(\d+\.?\d*)提取数字部分。
模块三:变量与数据暂存
表格数据通常是批量采集的,需要用变量暂存再统一处理。
列表变量:适合存储单列数据,比如所有商品名称。
变量名:list_product_names 变量类型:列表用"添加项到列表"指令,把每次循环采集到的名称追加进去。
数据表变量:适合存储多列数据,比如商品名称+价格+销量。
先"创建数据表",定义列名:商品名称、价格、销量。
然后在循环里,每次采集完一行数据,用"数据表添加行"指令写入。
我当时用列表存多列数据,搞了三个列表分别存名称、价格、销量。
后来发现数据对齐很麻烦,改成数据表之后,逻辑清晰了很多。
全局变量控制采集范围:
用一个全局变量max_pages控制最多采集多少页。
流程里读取这个变量,达到页数后自动停止,不用改流程代码。
模块四:流程控制——循环采集的三种模式
表格数据采集中,流程控制的核心就是循环。
模式一:FOR计数循环(固定行数)
知道表格总共有多少行,用FOR循环从第1行遍历到最后一行。
FOR i = 1 到 总行数: XPath = //table//tr[POSITION]//td[1] (把 POSITION 替换为变量 i) [video(video-8NNQFJgm-1782934025774)(type-csdn)(url-https://live.csdn.net/v/embed/526818)(image-https://v-blog.csdnimg.cn/asset/582d14c3bd0451c5399cd990b56e2a0d/cover/Cover0.jpg)(title-拼多多店群自动化报活动上架!)] 获取元素文本,存入数据表模式二:WHILE循环(不确定行数)
表格是动态加载的,不知道有多少行,用WHILE循环。
WHILE 存在"下一页"按钮: 获取当前页所有行数据 点击"下一页" 等待页面加载完成模式三:无限循环+退出条件(动态列表)
根据素材里的经验:如果操作后元素会消失(比如点击"同意"后按钮消失),用无限循环每次点第一个元素。
WHILE TRUE: 获取相似元素列表(所有行的第一个按钮) IF 列表长度 == 0: 退出循环 点击列表[0](第一个按钮) 等待操作完成循环中的坑:页面刷新导致元素失效
根据素材:如果循环中原网页刷新了,之前获取的相似元素会失效。
正确做法是用FOR次数循环,每次循环内重新获取相似元素列表。
获取相似元素列表,保存到 list_rows(仅获取长度用) FOR i = 0 到 list_rows.length - 1: 重新获取相似元素列表(防止页面刷新导致失效) 取新的列表[i] 进行操作模块五:网页自动化——三种表格类型的完整采集方案
方案一:标准table标签表格
这是最简单的情况,结构规范,XPath定位精准。
采集步骤:
第一步:用"获取相似元素列表"指令,获取所有行元素。
XPath://table//tbody//tr
第二步:用FOR循环遍历每一行。
第三步:在循环体内,用XPath定位该行的各列单元格。
行内定位写法(相对XPath):
.//td[1] 该行第一列 .//td[2] 该行第二列注意开头的点号,表示相对于当前行元素,不是从根节点开始。
完整指令逻辑:
获取相似元素列表(//table//tbody//tr)→ 保存到 list_rows 创建数据表(列:名称、价格) FOR EACH row IN list_rows: 获取元素文本(row, XPath=.//td[1])→ 名称 获取元素文本(row, XPath=.//td[2])→ 价格 数据表添加行(名称, 价格) 数据表写入Excel("输出.xlsx")方案二:div模拟的表格(动态列表)
现在很多网站用div+css模拟表格样式,不是真正的table标签。
这种表格的每一行是一个div,每行内的字段也是div。
采集步骤:
第一步:用"获取相似元素列表"指令,获取所有行div。
XPath://div[@class='table-row']
第二步:FOR循环遍历每一行div。
第三步:在行div内用相对XPath获取各字段。
获取相似元素列表(//div[@class='table-row'])→ list_rows FOR EACH row IN list_rows: 获取元素文本(row, XPath=.//div[@class='cell-name'])→ 名称 获取元素文本(row, XPath=.//div[@class='cell-price'])→ 价格 数据表添加行坑点:动态加载导致行数变化
页面滚动时会动态加载新行,之前获取的list_rows会过期。
解决方法:每次循环处理完一行后,重新获取list_rows,用索引i取当前行。
或者:每次只处理第一行,处理完删除或标记,然后重新获取列表。
这是素材里提到的"每次点第一个元素"的策略。
方案三:无限滚动表格
社交媒体系列网站常用无限滚动,滚动到底部自动加载更多内容。
采集步骤:
第一步:用"在网页上执行JavaScript"指令,滚动到页面底部。
function(element,input){window.scrollTo(0,document.body.scrollHeight);returndocument.body.scrollHeight;}第二步:等待新内容加载(用"固定等待"或"等待元素存在")。
第三步:判断是否已经加载完所有内容。
判断方法一:比较滚动前后的页面高度,高度不变说明到底了。
判断方法二:出现"没有更多了"的提示文字。
判断方法三:当前已采集的行数达到预期数量。
完整循环逻辑:
上次高度 = 0 当前高度 = 执行JS获取页面高度 WHILE 当前高度 > 上次高度: 获取当前所有行数据,存入数据表 执行JS滚动到底部 固定等待 2秒(等待新内容加载) 上次高度 = 当前高度 当前高度 = 执行JS获取页面高度 如果 出现"没有更多了":退出循环模块六:数据处理——采集后的清洗与转换
从网页上采集到的原始数据,往往不能直接用,需要清洗。
清洗场景一:价格数据去掉货币符号
采集到的价格文本:“¥199.00”、“$29.99”、“29.99元”
用"替换文本"指令,把"¥"、“$”、““元”、”," 全部替换为空。
然后用"转换为数字"指令,转成数字类型,方便后续比较和计算。
清洗场景二:去除空白字符
网页文本前后常有空格或换行符。
用"去除空格"指令,去掉首尾空格。
用"替换文本"指令,把换行符\n和制表符\t替换为空。
清洗场景三:合并相同数据
采集过程中可能因为页面刷新或重复加载,导致数据重复。
用"数据表去重"指令,根据指定列去重。
清洗场景四:筛选有效数据
比如只保留价格大于100的商品。
用"数据表筛选行"指令,条件设为"价格 > 100"。
模块七:鼠标键盘与图像识别的辅助作用
表格数据采集中,有时需要配合鼠标键盘操作。
场景一:滚动加载更多
前面讲过的无限滚动,除了用JS滚动,也可以用模拟鼠标滚轮。
用"鼠标滚动"指令,向下滚动一定距离。
但这种方式不如JS滚动精准,建议优先用JS方案。
场景二:点击"加载更多"按钮
有些表格不是无限滚动,而是有一个"加载更多"按钮。
用"点击元素"指令,捕获并点击这个按钮。
点击后等待新行出现,用"等待元素存在"指令等待新行的第一个单元格出现。
场景三:图像识别定位表格
如果表格结构极其复杂,无法用XPath定位,可以用图像识别。
截取某一列数据的图像作为模板,用"查找图像"指令定位。
但这种方式不稳定,只作为最后兜底方案。
模块八:进阶技能——JS注入提取复杂数据
有些表格数据不是直接存在DOM文本里,而是通过JS动态渲染的。
场景一:数据是存在data属性里的
<tddata-price="199.00">¥199</td>用"获取元素属性"指令,读取data-price属性值。
或者用JS注入:
function(element,input){returnelement.getAttribute('data-price');}场景二:数据是异步加载后插入的
页面HTML里没有数据,数据是通过Ajax请求获取的。
用JS注入直接读网页内的JS变量:
function(element,input){// 假设数据存在 window.__INITIAL_STATE__.productListreturnJSON.stringify(window.__INITIAL_STATE__.productList||[]);}返回后,用"执行Python脚本"指令解析JSON字符串。
场景三:表格有合并单元格
合并单元格用rowspan或colspan属性表示。
用JS注入读取每个单元格的实际行数和列数,处理跨行跨列的数据对齐问题。
模块九:平台实战——电商搜索结果页全字段采集
用一个完整案例,把前面所有知识串起来。
案例背景:采集某电商网站搜索"手机"的结果页,提取前5页所有商品的:商品名称、价格、销量、店铺名称。
第一步:打开搜索结果页
用"打开网页"指令,URL填搜索结果页的URL。
第二步:等待表格加载完成
用"等待元素存在"指令,等待第一个商品名称元素出现。
第三步:处理标准表格
用"获取相似元素列表"获取所有商品行。
XPath://div[@class='product-item']
第四步:循环提取每个商品的字段
FOR循环遍历每个商品行。
对每个行元素,用相对XPath提取各字段:
行元素 XPath=.//div[@class='name'] → 商品名称 行元素 XPath=.//div[@class='price'] → 价格 行元素 XPath=.//div[@class='sales'] → 销量 行元素 XPath=.//div[@class='shop'] → 店铺名称每行数据提取完后,用"数据表添加行"保存。
TEMU店群矩阵自动化运营核价报活动
第五步:翻页
用"点击元素"指令,点击"下一页"按钮。
用"等待元素存在"指令,等待新页面的第一个商品出现。
重复第三步到第五步,直到采集完5页或没有下一页。
第六步:数据清洗
用"数据表"指令,对价格列做清洗:去掉"¥"和",",转成数字。
第七步:导出Excel
用"数据表写入Excel"指令,导出到本地文件。
模块十:系统联动——采集数据的后续处理
表格数据采集完成后,往往需要和其他系统联动。
联动一:写入本地Excel
用"数据表写入Excel"指令,支持xlsx格式。
可以指定工作表名称、是否包含列头、起始单元格位置。
联动二:发送邮件(带附件)
采集完成后,用"发送邮件"指令,把Excel文件作为附件发送给相关人员。
联动三:调用API上传数据
用"发送HTTP请求"指令,把采集到的数据POST到内部系统的API接口。
数据需要先用"执行Python脚本"转成JSON格式。
联动四:写入数据库
用"执行Python脚本"指令,在Python脚本里用pymysql或sqlite3库,把数据写入数据库。
模块十一:工程化规范
当表格采集流程变复杂时,需要做好工程化管理。
规范一:采集字段统一命名
团队内部统一字段命名规范,比如:product_name、product_price、shop_name。
不要用"字段1"、"字段2"这种无意义名称。
规范二:采集失败重试机制
某行数据提取失败时,记录日志,跳过这行继续处理下一行。
不要因为一行数据出错导致整个采集流程中断。
用"尝试捕获错误"指令包住每行数据的提取逻辑。
规范三:采集进度保存
大数据量采集时,每隔一定行数保存一次进度。
如果流程意外中断,可以从上次进度继续,不用重新采集。
实现方法:每采集完一行,把行号写入本地文本文件。
重启流程时,先读取进度文件,从指定行号继续采集。
规范四:反爬应对策略
采集频率不要太高,每次操作后加1-2秒随机等待。
User-Agent可以用"执行Python脚本"随机生成,减少被识别为机器人的概率。
模块十二:速查表与常见报错
XPath定位表格元素速查
| 需求 | XPath写法 |
|---|---|
| 整个表格 | //table |
| 所有行 | //table//tr |
| 排除表头的行 | //table//tbody//tr |
| 第N行 | (//table//tr)[N] |
| 第一列(所有行) | //table//tr//td[1] |
| 行内第一列(相对XPath) | .//td[1] |
| 包含特定文本的行 | //tr[contains(.,‘关键词’)] |
| div模拟的行 | //div[@class=‘table-row’] |
| div模拟的行内字段 | .//div[@class=‘cell-name’] |
常见报错排查
| 报错现象 | 原因 | 解决方案 |
|---|---|---|
| 获取相似元素列表返回空 | 元素选择器写得不对 | 在F12的Console里用$x()测试XPath |
| 循环中只采集到第一行 | 页面刷新导致元素失效 | 每次循环内重新获取元素列表 |
| 采集到的数据有重复 | 滚动加载导致同一行被采集多次 | 记录已采集的ID,去重后再存储 |
| 采集到一半流程报超时 | 某一行数据加载慢 | 增大超时时间或用错误处理包住 |
| 价格数据包含乱码 | 网页用了自定义字体 | 用JS注入读取实际渲染后的文本 |
数据清洗正则表达式速查
| 需求 | 正则表达式 |
|---|---|
| 提取价格数字 | [\d,]+\.?\d* |
| 去掉所有HTML标签 | <[^>]+> |
| 去掉首尾空格 | `^\s+ |
| 提取中文 | [\u4e00-\u9fa5]+ |
| 提取英文和数字 | [a-zA-Z0-9]+ |
总结
表格数据批量提取是影刀RPA的核心能力,也是最容易出问题的地方。
核心思路是:先分析表格结构,再选择合适的采集方案,最后做好数据清洗。
标准table标签最简单,div模拟表格要注意动态加载,无限滚动要用JS辅助。
把所有方案都掌握了,市面上90%的网页表格你都能采。
如果你在表格采集中遇到了本文没覆盖的情况,可以访问 home.linyan.cloud 给我留言。
#影刀RPA #RPA教程 #表格数据提取 #网页表格采集 #动态列表 #无限滚动 #影刀新手 #RPA零基础 #数据抓取
作者:林焱