采集表格数据时,经常遇到“姓名”和“年龄”不在同一个单元格。
或者想抓“价格”,但页面只有“单价:¥99”这种标签+值的结构。
用参照物定位:先找到特征文字(标签),再通过兄弟关系定位到它的值。
一、什么时候用兄弟定位?
页面结构长这样:
<div class="info-row">
<span class="label">商品名称</span>

<span class="value">新疆阿克苏苹果</span>
</div>
<div class="info-row">
<span class="label">商品价格</span>
<span class="value">¥39.9</span>

</div>
你想抓“¥39.9”,但它的class没有唯一标识。
而“商品价格”这个文字是固定的。
方法:先定位到“商品价格”,再找它后面的兄弟元素。
二、following-sibling:定位后面的兄弟
following-sibling::* 表示当前节点之后的所有同级兄弟节点。
following-sibling::*[1] 表示紧挨着的第一个兄弟。
# 捕获元素:先定位到“商品价格”标签
//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>
想抓价格,但“限时特价”更容易定位。
# 捕获元素:先定位“限时特价”标签
//span[text()='限时特价']
# 捕获元素:它前面的第一个兄弟(价格)
//span[text()='限时特价']/preceding-sibling::*[1]
实战案例:拼多多SKU面板中的库存数量
# 捕获元素:找到“库存”文字
//div[contains(text(),'库存')]
# 捕获元素:它前面的兄弟(库存数字,可能在左边)
//div[contains(text(),'库存')]/preceding-sibling::*[1]
四、通过父级搭桥:兄弟定位的增强版
如果标签和值不在同一个父级下,先找到共同的父元素。
<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学习手册》系列文章之一,内容源于实操经验的整理与分享。
