影刀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-iddata-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_abc123goods-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(), "拼多多")]
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/d4cdf9f255cb4823b7d1c07da45da21c.png#pic_center)

这个在采集商品标题时特别有用——标题经常被多个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学习手册》系列文章之一,内容源于实操经验的整理与分享。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐