影刀RPA进阶教程:元素属性动态变化的通配策略——正则与contains组合
做电商采集最绝望的瞬间,是流程昨天还跑得好好的,今天一运行满屏"元素定位失败"。打开F12一看,页面结构没变,变的是属性——class后面多了个随机后缀,某个状态值从active换成了checked,元素还是那个元素,属性已经不是那批属性了。
我维护的抖音和淘宝采集流程,平均每两周就会遇到一次属性动态变化。后来我在影刀RPA的元素编辑里把正则表达式和通配符用熟了,这个问题就从灾难变成了五分钟的例行维护。官方文档里专门有一篇讲"正则表达式和全局变量在元素编辑中的应用",这篇教程我结合自己两个月的实战,把通配策略讲透。
核心思路一句话:属性会变的部分不写死,用正则圈定范围,用contains抓稳定片段。
动手前确认环境:影刀RPA客户端更新到最新版,通配符和正则匹配在旧版本上有过行为不一致的记录;插件状态正常后,先在元素编辑界面点校验按钮确认你的影刀RPA能吃下正则语法,再大规模改造元素。
元素定位四合一的进阶视角:属性匹配的三档武器
先复习定位四件套的关系。捕获元素、CSS选择器、XPath选择器解决"怎么找到元素",而当元素属性动态变化时,真正起作用的是属性匹配的三档武器:
| 武器 | 灵活度 | 适用场景 |
|---|---|---|
| 精确匹配 | 零 | 属性完全固定 |
| contains/通配符 | 中 | 局部固定局部变 |
| 正则表达式 | 高 | 规律复杂或多状态 |
影刀RPA的元素编辑中,所有属性都支持通配符和正则表达式,这一点是官方文档白纸黑字写的,也是这篇所有玩法的地基。属性匹配方式在下拉里切换:纯文本、通配符、正则。
状态切换陷阱:用一个正则排除法锁定元素
先看官方文档里的原始案例,这个例子我原样复刻过。页面上有个复选框,勾选时属性是CBX_active_18l33c8,不勾选时是CBX_18l33c8,怎么让一个元素同时匹配勾选和不勾选两种状态?
笨办法是捕获两个元素分别处理,页面一多就崩。正则解法一行搞定:
# 匹配所有不包含 active 的字符串(元素编辑属性框里直接填) ^((?!active).)*$ # 同时排除多个关键字的写法(排除disabled、prev、diff三个)  ^((?!disabled|prev|diff).)*$^((?!active).)*$读法是"从头到尾任何一个位置都不出现active",竖线隔开就能一次排除一堆关键字。我把这条正则设为该属性的匹配条件后,复选框不管勾没勾选都能稳定校验到,状态判断改用【获取元素属性】指令读取属性值,再用If判断文本里是否包含active——定位归定位,判断归判断,两条线分开走,稳定性翻倍。
这个排除法正则我后来用到了十几个场景:排除广告位的-sponsored后缀、排除禁用按钮的disabled、排除隐藏元素的hidden,全是同一套模板换关键字。
contains组合拳:XPath里的稳定片段抓取
XPath这边的对应武器是contains和starts-with。动态class通常长这样:btn-3f8a2-primary,中间的哈希每次刷新都变,但前缀btn-和后缀primary是稳的。
# 捕获元素:class前缀稳定、后缀随机的提交按钮 //button[starts-with(@class,"btn-") and contains(@class,"primary")] # 捕获元素:class含多个动态片段,只锚定最稳定的那个词 //div[contains(@class,"goods-card") and contains(@class,"selected")] # 捕获元素:id带随机后缀的列表容器 //*[starts-with(@id,"itemList_")] # 组合文本定位:属性会变但文本不变时锚定文本 //a[contains(@class,"btn") and contains(text(),"立即抢购")]选型经验:属性里只要存在一个永远不变的词,就用contains锚那个词;只有前缀或后缀稳定,用starts-with或ends-with思路;两个都变但整体规律可循,才上正则。能用contains解决的不用正则,正则调试成本更高。
XPath里其实也有排除思路,not加contains组合://div[not(contains(@class,"disabled"))]选中所有不带disabled的元素,翻页判断时这是主力写法。
全局变量与fx:把变量嵌进元素属性
官方文档给的第二个玩法是全局变量做元素属性。新建全局变量后,编辑元素时点属性值后面的fx图标,选择全局变量,这个属性的值就变成了变量当前的内容。
两个典型用法,我都跑在生产流程里:
用法一:变量存固定值,一套元素多点复用。建一个全局变量"按钮名称",元素的文本属性绑它,流程里先设变量为"新闻"再点击,再设为"学术"再点击,一个元素定义顶两个用。校验时记得先给变量设默认值,或者暂时改回纯文本,否则校验阶段匹配不到。
用法二:变量存正则,一元素匹配多状态。把全局变量的值设成(直|新),元素属性绑定这个变量后,匹配方式选正则,这个元素就同时匹配"直播"和"新闻"两类链接。官方文档的示例就是用这个变量配合相似元素循环,把页面上两类链接一次性全抓下来逐个点击。
| 变量内容 | 匹配方式 | 效果 |
|---|---|---|
| 新闻 | 纯文本 | 只匹配新闻 |
| (直|新) | 正则 | 匹配直播和新闻 |
| ^((?!active).)*$ | 正则 | 排除含active的属性 |
流程控制与翻页:动态属性的经典战场
不确定总页数的翻页是通配策略的第一实战场景。官方文档给过明确思路:下一页按钮可点击时class不含disabled,处于最后一页时class包含disabled。写成XPath就是:
# 捕获元素:可点击状态的下一页按钮 //a[text()="下一页" and not(contains(@class,"disabled"))] # 捕获元素:带disabled的下一页(用于判断终止) //a[text()="下一页" and contains(@class,"disabled")]流程结构用【While条件循环】:循环条件是"按钮元素存在且不含disabled",循环体内抓数据加点击翻页。判断元素是否存在用【判断元素是否存在(web)】指令,返回True或False直接喂给While。
另一种页码式翻页用【For次数循环】:先抓"共100页"的文本,用【从文本中提取内容】的正则\d+提出数字,循环次数设成这个数。提取和循环的组合在这里又用上了。
网页自动化:属性变化叠加等待的正确姿势
属性动态变化的页面往往加载也乱,通配策略要和等待策略配套用。我的标准搭配是:翻页或操作后先【等待元素(web)】等新版块容器出现,容器出现后再做属性判断。等待的锚点元素本身也要用contains写法,不然等待环节就先失败了。
弹窗是另一个变量来源。有的弹窗出现后会给body加一个class,导致原有元素校验不过。处理顺序沿用官方那套:回车、Esc、刷新、点空白、Tab加回车,测出有效的那招放在流程开头先执行。
变量类型与数据处理:抓回来的数据怎么接
通配策略抓到的数据流进变量后,该清洗清洗,该落表落表。我的顺序是【写入行数据到表格】前先用【文本替换】清一遍杂字符,价格里的逗号、标题里的换行,都在这一步处理。批量抓取用【批量数据抓取(web)】指令配合extract_table逻辑,返回二维表格后直接【写入区域数据到表格】一次性落表,比逐行写快一个量级。
鼠标键盘图像与进阶技能:兜底与绕行
属性变得连正则都追不上时(某些网站每次构建class全变),及时止损换路线:图像识别点击兜底,【HTTP请求】指令直接调接口绕开页面。接口返回JSON用【JSON解析】指令拆字段,比任何属性匹配都稳定。抖音类站点class哈希每天换,我最终方案就是接口加JSON,通配策略做二线备用。
OCR也是兜底选项:【截图】加OCR文字识别,拿到文本再正则提取,图片渲染的价格就靠这条路抓。
平台实战:抖音商品页的通配改造实录
拿我真实改过的抖音商品采集流程举例。原版元素锚定class=“goods-title-xxxx”(xxxx是构建哈希),三天两头失效。改造三步:
- 元素class匹配改成contains锚"goods-title",哈希部分不再参与匹配
- 加一层正则排除:^((?!hidden).)*$,把隐藏状态的元素排除掉
- 列表容器用starts-with锚id前缀,子元素相对容器定位,减少独立锚点数量
改造后连续跑了六周,只维护过一次(网站改版换了前缀词)。通配策略不是一劳永逸,但它把"每天修"变成了"偶尔修",这就是它最大的价值。
系统联动与工程化规范:策略的长期维护
通配策略的元素定义要在工程层面管理:命名规范"平台_页面_元素",每个动态属性旁边加批注写明正则的含义和上次失效日期。失效的元素我用飞书机器人通知自己——【发送飞书消息】在流程异常时推消息,附上失败子流程名,我在手机上就知道哪里要修。
定时任务跑的流程,建议把元素校验做成子流程自检:开工前先跑一遍核心元素的存在性检查,全过再正式采集,不过就发通知终止,避免跑一半留一堆脏数据。
易错速查表
| 现象 | 原因 | 解法 |
|---|---|---|
| 正则排除法不生效 | 匹配方式没切成正则 | 属性匹配方式下拉选正则 |
| 变量绑属性后校验失败 | 变量没有默认值 | 先设默认值或暂改纯文本 |
| contains锚的词也失效 | 网站换了命名前缀 | 批注里记录并更新锚词 |
| not contains误杀目标 | class里有同名字段 | 换更长的特征词 |
| 通配后匹配到多个元素 | 范围放太宽 | 叠加父容器限定再筛 |
延伸阅读
抖音商品页通配改造前后的完整对比源码,还有我整理的12条常用属性正则清单,放在代码仓库 home.linyan.cloud,可以直接参考改造。官方文档"正则表达式和全局变量在元素编辑中的应用"是本篇的方法论源头,配合食用效果最好。
属性会变不可怕,可怕的是每次都重捕获重调试。把正则、contains、全局变量这三样练成肌肉记忆,你写的流程就从"娇气"变成"皮实",这中间的差距,就是新手和老手之间真正的分水岭。
#影刀RPA #RPA自动化 #元素定位 #正则表达式 #抖音采集
作者:林焱