影刀RPA新手教程_XPath属性选择器与模糊匹配实战
影刀RPA新手教程:XPath属性选择器与模糊匹配的5个实战场景
元素捕获点一下很方便,但不够灵活。
遇到动态内容、批量数据、复杂嵌套的时候,还得靠XPath。
我刚开始看XPath也觉得绕,//是什么,contains又是什么。但只要掌握几个固定模式,大部分场景都能套用。

一、为什么需要学XPath
影刀的捕获功能背后也是XPath。手动写XPath的优点是:
- 可以直接定位"包含某个关键词"的元素,不用精确匹配
- 可以写更短的路径,比自动捕获更稳定
- 一个XPath可以匹配多个相似元素,配合循环批量处理
三种最常用的XPath模式:属性选择器、模糊匹配、参照物定位。这篇文章讲前两种。
二、模式1:属性选择器——最直接的定位

语法:
//标签名[@属性名="属性值"]
核心原理:通过HTML标签的某个属性值来定位。id、class、name、type这些属性都可以用。
实战场景1:登录按钮的定位
拼多多店群自动化上架方案
百度登录按钮的id是s-top-loginbtn,直接写:

# 捕获:百度的登录按钮
//a[@id="s-top-loginbtn"]
淘宝搜索按钮的type是submit:
# 捕获:淘宝搜索按钮
//button[@type="submit"]
什么时候用属性选择器:目标元素的id、name、type等属性值固定不变。这些属性比class更稳定,优先使用。
实战场景2:通过data属性定位列表项
很多电商网站会给商品列表项加data-id或data-index属性:

# 拼多多商品列表第3个商品
//div[@data-index="3"]
# TEMU商品详情页通过data-goods-id定位
//div[@data-goods-id="123456"]
三、模式2:模糊匹配——内容不确定时用
语法:
# 包含某段文字
//*[contains(text(), "关键词")]
# 属性值包含某段字符串
//标签[contains(@属性名, "部分值")]
# 以某段文字开头
//*[starts-with(text(), "开头文字")]
# 以某段文字结尾(需要ends-with函数)
//*[contains(text(), "结尾文字")] # contains也能实现类似效果
实战场景3:小红书号的模糊匹配

小红书个人主页,"小红书号:xxxx"的文字固定,但具体的号每个人不同。
# 捕获:小红书号所在元素
//*[contains(text(),'小红书号')]
进阶:拿到小红书号后,再通过参照物定位到它前面的昵称:
# 通过"小红书号"定位到它的前一个兄弟元素(用户昵称)
//*[contains(text(),'小红书号')]/../preceding-sibling::*[1]
实战场景4:检查自己是否评论过
你在一个笔记下面翻评论,想判断自己是不是已经评论过了。

# 模糊匹配:查找包含自己昵称的评论元素
//*[contains(@class,'comment-item')]//span[contains(text(),'你的昵称')]
如果找到元素→说明评论过。找不到→没评论过。比循环比对每条评论高效得多。
实战场景5:批量匹配class名带随机后缀的元素
很多电商网站的class名带随机后缀,比如goods-item_abc123、goods-item_def456。
# 用contains模糊匹配class名
//div[contains(@class,'goods-item')]
这样不管后缀随机成什么,只要class里包含goods-item就能匹配到。

四、string()函数——模糊匹配的高级用法
上面说的text()只能匹配元素内部的纯文本。如果文本被多个子元素分散了,需要用string()。
# text()匹配不到的情况:
# <div>拼多多<span>旗舰店</span></div>
# text()只能分别匹配"拼多多"和"旗舰店",匹配不到"拼多多旗舰店"
[video(video-Ieq3MMjv-1781009959284)(type-csdn)(url-https://live.csdn.net/v/embed/524993)(image-https://v-blog.csdnimg.cn/asset/a547123d88ad712dccba346c9217e237/cover/Cover0.jpg)(title-TEMU店群如何管理运营?)]
# string()可以匹配整个合并后的文本:
//div[string()="拼多多旗舰店"]
模糊匹配也类似:
# 查找整个文本中包含"拼多多"的元素
//div[contains(string(), "拼多多")]

这个在采集商品标题时特别有用——标题经常被多个span标签拆开。
五、组合使用:多个条件同时满足
用一个XPath同时满足多个条件:
# 定位:同时满足class是goods-item、并且data-status是active的元素
//div[contains(@class,'goods-item') and @data-status='active']
# 定位:文字包含"搜索"的button或a标签
//*[contains(text(),'搜索') and (@type='submit' or local-name()='a')]
六、XPath校验工具推荐

写好的XPath不确定能不能用?
- XPath Helper(浏览器插件):输入XPath,页面直接高亮匹配结果。Chrome商店下架后可以从第三方下载
- 影刀内置的"校验元素":捕获元素弹窗里有XPath测试功能
- 按F12打开Console,输入:
$x('你的XPath')直接测试
// 在浏览器Console里测试XPath
$x('//div[contains(@class,"goods-item")]')
// 返回所有匹配的元素数组
七、易错速查
| 问题 | 原因 | 修正 |
|---|---|---|
| XPath找不到元素 | 大小写不匹配 | contains(text(),'Abc') 区分大小写,页面可能是’abc’ |
| 匹配到多个元素 | XPath不够精确 | 再加一个and条件或加index限定 |
![]() |
| text()匹配不到 | 文本被子元素拆分了 | 改用string()函数 |
| //和/搞混 | //是任意位置,/是直接子级 | 用//更宽松,用/更精确 |
作者:林焱
本文为《影刀RPA学习手册》系列文章之一,内容源于实操经验的整理与分享。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐




所有评论(0)