文档备案控制台
免费开始使用

影刀RPA进阶教程:XPath参照物定位——preceding-sibling与following-

采集表格数据时,经常遇到“姓名”和“年龄”不在同一个单元格。
或者想抓“价格”,但页面只有“单价:¥99”这种标签+值的结构。

picture.image 用参照物定位:先找到特征文字(标签),再通过兄弟关系定位到它的值。

一、什么时候用兄弟定位?

picture.image 页面结构长这样:

<div class="info-row">
    <span class="label">商品名称</span>
    
![picture.image](https://p6-volc-community-sign.byteimg.com/tos-cn-i-tlddhu82om/dab134f6d4a645378e6d8576ccf8ac5e~tplv-tlddhu82om-image.image?=&rk3s=8031ce6d&x-expires=1782595890&x-signature=OIMR9d4ehFpwCOULfymTO%2BL9f9k%3D)
    <span class="value">新疆阿克苏苹果</span>
</div>
<div class="info-row">
    <span class="label">商品价格</span>
    <span class="value">¥39.9</span>
    
![picture.image](https://p6-volc-community-sign.byteimg.com/tos-cn-i-tlddhu82om/8d9fe0ed9b1b4570b87799fc75c18e46~tplv-tlddhu82om-image.image?=&rk3s=8031ce6d&x-expires=1782595890&x-signature=obf%2FsRbj5h8gxsFzJ65qm0w9vZM%3D)
</div>

你想抓“¥39.9”,但它的class没有唯一标识。
而“商品价格”这个文字是固定的。

picture.image

方法:先定位到“商品价格”,再找它后面的兄弟元素。


picture.image

二、following-sibling:定位后面的兄弟

following-sibling::* 表示当前节点之后的所有同级兄弟节点。
following-sibling::*[1] 表示紧挨着的第一个兄弟。

picture.image

# 捕获元素:先定位到“商品价格”标签
//span[text()='商品价格']

# 捕获元素:它后面的第一个兄弟(价格数值)

//span[text()='商品价格']/following-sibling::*[1]

# 如果价格在第2个兄弟位置,写:
//span[text()='商品价格']/following-sibling::*[2]

实战案例:淘宝商品详情页的参数表

# 捕获元素:找到“品牌”标签
//li[@class='param-item']//span[text()='品牌']

# 捕获元素:它后面的兄弟(品牌名称)
//li[@class='param-item']//span[text()='品牌']/following-sibling::*[1]

三、preceding-sibling:定位前面的兄弟

反过来,如果特征文字在右边,想抓左边的值。

<div class="info">
    <span class="price">¥29.9</span>
    <span class="tag">限时特价</span>
</div>

picture.image

picture.image 想抓价格,但“限时特价”更容易定位。

# 捕获元素:先定位“限时特价”标签
//span[text()='限时特价']

# 捕获元素:它前面的第一个兄弟(价格)
//span[text()='限时特价']/preceding-sibling::*[1]

实战案例:拼多多SKU面板中的库存数量

# 捕获元素:找到“库存”文字
//div[contains(text(),'库存')]

# 捕获元素:它前面的兄弟(库存数字,可能在左边)
//div[contains(text(),'库存')]/preceding-sibling::*[1]

四、通过父级搭桥:兄弟定位的增强版

如果标签和值不在同一个父级下,先找到共同的父元素。

picture.image

<div class="product">
    <div class="title">苹果手机</div>
    <div class="price-row">
        <span>价格:</span>
        <span class="num">5999</span>
    </div>
</div>

想抓价格数字5999,但“价格:”是一个文本节点(没有标签包裹)。

解决方法:用父级搭桥

# 步骤1:定位到包含“价格:”文本的父div
//div[contains(text(),'价格:')]

# 步骤2:在父div下,找class="num"的span
//div[contains(text(),'价格:')]//span[@class='num']

# 或者用兄弟定位:先定位到“价格:”所在的span(如果它是span)
//span[contains(text(),'价格:')]/following-sibling::span[@class='num']

五、完整代码示例:采集商品参数表

以京东商品详情页为例,采集“品牌、型号、产地”三个参数。

# 页面结构:参数表每行是一个div,左边是标签,右边是值
# 捕获元素:品牌标签(特征文字固定)
//div[@class='parameter']//li[contains(text(),'品牌')]

# 捕获元素:品牌值(它后面的兄弟)
//div[@class='parameter']//li[contains(text(),'品牌')]/following-sibling::li[1]

# 影刀实现步骤:
# 1. 用“获取元素文本”指令,XPath写上面第二个
# 2. 存入变量:品牌值

# 同理,型号:
//div[@class='parameter']//li[contains(text(),'型号')]/following-sibling::li[1]

# 同理,产地:
//div[@class='parameter']//li[contains(text(),'产地')]/following-sibling::li[1]

注意: 如果页面上不存在某个参数(比如没有“型号”),需要用“判断元素是否存在”指令,否则会报错。


六、兄弟定位速查表

需求XPath写法
当前节点后面的第一个兄弟//span[@class='label']/following-sibling::*[1]
当前节点后面的所有兄弟//span[@class='label']/following-sibling::*
当前节点前面的第一个兄弟//span[@class='label']/preceding-sibling::*[1]
后面第二个兄弟following-sibling::*[2]
后面所有span标签的兄弟following-sibling::span
前面第一个div兄弟preceding-sibling::div[1]

七、易错速查表

错误现象原因解决方法
取到空值兄弟索引写错(比如第2个但实际是第1个)在浏览器F12控制台用$x()测试,调整数字
取到多个值特征文字匹配到多个元素给特征文字加更多限定条件,比如父级class
取到标签本身忘了写following-sibling,写成了父级检查XPath最后有没有/following-sibling::*[1]
报错元素不存在页面上没有这个兄弟先用“判断元素是否存在”做分支

八、推荐资源

  • Chrome插件:XPath Helper – 写完后按回车,直接看匹配结果
  • 影刀官方文档:搜索“兄弟节点”有示例动图
  • 我的练习建议:打开京东任意商品详情页,用F12写XPath抓参数表,半小时就能上手

作者:林焱

本文为《影刀RPA学习手册》系列文章之一,内容源于实操经验的整理与分享。

0
0
0
0
评论
未登录
暂无评论