影刀RPA进阶教程XPath参照物定位preceding-sibling与following-sibling实战有一种定位场景非常普遍页面上某个元素没有任何唯一属性但它的哥哥/弟弟/邻居有。比如小红书的评论区。每条评论的时间文本是一样的span刚刚/span没ID也没唯一class。但时间前面紧挨着的就是用户名用户名每条都不一样。这种用参照物定位最省事。一、什么场景必须用参照物定位前两篇文章讲了属性选择器contains/starts-with、父子定位现在讲第三种参照物定位。使用场景特征目标元素本身没有唯一属性没有唯一id、没有唯一class、文本内容每条都不一样但它旁边有一个唯一特征明显的元素文本固定、class固定、位置固定找哥哥preceding-sibling或者找弟弟following-sibling实际案例参照物目标元素方向电商SKU列表已选标记用户选中的规格值后面兄弟表格操作列编辑按钮同一行的删除按钮前面兄弟评论列表用户名用户的评论内容后面兄弟商品详情页价格标签价格数值后面兄弟二、preceding-sibling找前面的兄弟preceding-sibling从当前元素往前找同级的元素。# 含义找到文本为价格的元素然后往前找它的前一个兄弟元素//*[contains(text(),价格)]/preceding-sibling::*[1]# 含义往前找第2个兄弟[video(video-on2gr0Vm-1781112567605)(type-csdn)(url-https://live.csdn.net/v/embed/525000)(image-https://v-blog.csdnimg.cn/asset/23da3fe1f67a47106d725406cfde9a97/cover/Cover0.jpg)(title-拼多多店群自动化上架方案)]//*[text()价格]/preceding-sibling::*[2]实战案例小红书中提取用户昵称小红书的评论结构里用户名和评论时间是两个相邻的兄弟元素。时间的class固定为date用户名没有。# 参照物评论时间文本固定、有索引# 目标评论时间前面的用户昵称# 捕获元素通过时间定位到昵称时间是昵称的后一个兄弟//span[classdate]/preceding-sibling::*[1]反过来操作也行——先定位时间然后找前面的昵称。关键是搞清楚谁在前面。三、following-sibling找后面的兄弟# 含义找到文本为用户名的元素然后往后找第一个兄弟//*[text()用户名]/following-sibling::*[1]# 含义找到input标签往后找第3个兄弟//input/following-sibling::*[3]实战案例表格里的操作按钮HTML表格一行有4个按钮查看、编辑、复制、删除。其中编辑按钮有独特的文本标识删除按钮没有。# 参照物编辑按钮文本固定编辑# 目标同一行的删除按钮编辑后面的兄弟# 捕获元素从编辑找删除//button[text()编辑]/following-sibling::button[3]# 或者更保险的写法找父容器再往下定位//tr[.//td[text()商品001]]//button[text()删除]第二种写法更稳——通过行里的某个唯一值来定位行再从行里找目标。建议优先用这种方式。四、通过父容器定位推荐优先用这个参照物定位有时会出问题——DOM结构变了兄弟位置也跟着变。更稳的套路是先找到能唯一定位的父容器再从父容器里往下找目标。# 思路找到包含订单号12345678这一行再定位这一行里的操作按钮# 第一步定位父容器包含唯一文本的行//tr[contains(.,12345678)]# 第二步从父容器里往下找目标元素//tr[contains(.,12345678)]//button[text()删除]这比preceding-sibling稳定得多。兄弟元素的位置只要HTML不重新排列就不会变但DOM结构微调在电商平台更新中是家常便饭。五、…/ 回到上一层别忽略这个参照物定位里有一个特别常用的符号..表示回到父级。# 场景当前定位到一个span已知需要找它父容器里的另一个元素# 上到父级再往下找title//span[classprice]/../div[classtitle]# 上到父级再上到父级再找兄弟//span[classprice]/../../following-sibling::div[1]实际案例拼多多商品卡片的已拼xx万件。销量文本已拼1.2万件每次都不一样没法用文本匹配。但它旁边有一个固定的已拼标签。# 找已拼的父容器整个销量块然后在父容器里找具体数字//span[text()已拼]/..# 更直接通过已拼的父容器找数字span//span[text()已拼]/../span[classnum]六、完整实战批量提取小红书评论区数据# 小红书笔记评论区采集打开网页(https://www.xiaohongshu.com/explore/xxxxxxxxxx)等待元素出现(评论区容器,5秒)# 获取所有评论的相似元素列表# 捕获元素每条评论的外层容器# //div[classcomment-item]获取相似元素列表(评论列表)-评论列表 新建Excel-评论数据表 写入行数据(评论数据表,[序号,用户名,评论内容,发布时间])遍历列表(评论列表,当前评论):序号当前循环索引1# 方法1用preceding-sibling通过时间定位用户名# 时间元素有date class用户名在时间前面获取元素文本(当前评论,.//span[contains(class,date)]/preceding-sibling::a[1])-用户名# 方法2直接取评论内容有class可以直接定位获取元素文本(当前评论,.//span[classcontent])-评论内容# 获取发布时间有class可以直接定位获取元素文本(当前评论,.//span[contains(class,date)])-发布时间 写入行数据(评论数据表,[序号,用户名,评论内容,发布时间])导出表格(评论数据表,D:\小红书评论_20260609.xlsx)TEMU店群如何管理运营七、参照物定位的三个坑坑1以为兄弟位置固定结果DOM结构悄悄变了这在实际项目中很常见。电商平台隔几个月改版一次原来紧挨着的兄弟元素中间插了一个div。预防不要依赖[1]紧挨着的兄弟尝试用更大的偏移量或用父容器定位兜底。坑2不同浏览器渲染的DOM层级可能不一样Chrome的开发者工具和影刀内置浏览器的解析结果偶尔会有差异。解决方法用影刀自带的捕获元素看XPath不要直接抄Chrome开发者工具的XPath。坑3preceding-sibling::*[1]可能返回你没想到的元素*匹配所有标签包括br、img、空白文本节点。改善# ❌ 可能匹配到空白或换行//span[classdate]/preceding-sibling::*[1]# ✅ 指定标签类型//span[classdate]/preceding-sibling::a[1]//span[classdate]/preceding-sibling::div[1]八、速查三种定位方式的选择优先级优先级定位方式适用场景1最稳父容器定位目标有唯一文本或属性的父级订单号、商品ID2属性/文本直接匹配元素自身有id、唯一class、固定文本3兜底参照物定位目标没有唯一特征但邻居有我的习惯先尝试直接匹配不行就上父容器定位最后才考虑兄弟参照物。作者林焱本文为《影刀RPA学习手册》系列文章之一内容源于实操经验的整理与分享。
影刀RPA进阶教程_XPath参照物定位preceding-sibling与following-sibling实战
发布时间:2026/6/11 17:24:03
影刀RPA进阶教程XPath参照物定位preceding-sibling与following-sibling实战有一种定位场景非常普遍页面上某个元素没有任何唯一属性但它的哥哥/弟弟/邻居有。比如小红书的评论区。每条评论的时间文本是一样的span刚刚/span没ID也没唯一class。但时间前面紧挨着的就是用户名用户名每条都不一样。这种用参照物定位最省事。一、什么场景必须用参照物定位前两篇文章讲了属性选择器contains/starts-with、父子定位现在讲第三种参照物定位。使用场景特征目标元素本身没有唯一属性没有唯一id、没有唯一class、文本内容每条都不一样但它旁边有一个唯一特征明显的元素文本固定、class固定、位置固定找哥哥preceding-sibling或者找弟弟following-sibling实际案例参照物目标元素方向电商SKU列表已选标记用户选中的规格值后面兄弟表格操作列编辑按钮同一行的删除按钮前面兄弟评论列表用户名用户的评论内容后面兄弟商品详情页价格标签价格数值后面兄弟二、preceding-sibling找前面的兄弟preceding-sibling从当前元素往前找同级的元素。# 含义找到文本为价格的元素然后往前找它的前一个兄弟元素//*[contains(text(),价格)]/preceding-sibling::*[1]# 含义往前找第2个兄弟[video(video-on2gr0Vm-1781112567605)(type-csdn)(url-https://live.csdn.net/v/embed/525000)(image-https://v-blog.csdnimg.cn/asset/23da3fe1f67a47106d725406cfde9a97/cover/Cover0.jpg)(title-拼多多店群自动化上架方案)]//*[text()价格]/preceding-sibling::*[2]实战案例小红书中提取用户昵称小红书的评论结构里用户名和评论时间是两个相邻的兄弟元素。时间的class固定为date用户名没有。# 参照物评论时间文本固定、有索引# 目标评论时间前面的用户昵称# 捕获元素通过时间定位到昵称时间是昵称的后一个兄弟//span[classdate]/preceding-sibling::*[1]反过来操作也行——先定位时间然后找前面的昵称。关键是搞清楚谁在前面。三、following-sibling找后面的兄弟# 含义找到文本为用户名的元素然后往后找第一个兄弟//*[text()用户名]/following-sibling::*[1]# 含义找到input标签往后找第3个兄弟//input/following-sibling::*[3]实战案例表格里的操作按钮HTML表格一行有4个按钮查看、编辑、复制、删除。其中编辑按钮有独特的文本标识删除按钮没有。# 参照物编辑按钮文本固定编辑# 目标同一行的删除按钮编辑后面的兄弟# 捕获元素从编辑找删除//button[text()编辑]/following-sibling::button[3]# 或者更保险的写法找父容器再往下定位//tr[.//td[text()商品001]]//button[text()删除]第二种写法更稳——通过行里的某个唯一值来定位行再从行里找目标。建议优先用这种方式。四、通过父容器定位推荐优先用这个参照物定位有时会出问题——DOM结构变了兄弟位置也跟着变。更稳的套路是先找到能唯一定位的父容器再从父容器里往下找目标。# 思路找到包含订单号12345678这一行再定位这一行里的操作按钮# 第一步定位父容器包含唯一文本的行//tr[contains(.,12345678)]# 第二步从父容器里往下找目标元素//tr[contains(.,12345678)]//button[text()删除]这比preceding-sibling稳定得多。兄弟元素的位置只要HTML不重新排列就不会变但DOM结构微调在电商平台更新中是家常便饭。五、…/ 回到上一层别忽略这个参照物定位里有一个特别常用的符号..表示回到父级。# 场景当前定位到一个span已知需要找它父容器里的另一个元素# 上到父级再往下找title//span[classprice]/../div[classtitle]# 上到父级再上到父级再找兄弟//span[classprice]/../../following-sibling::div[1]实际案例拼多多商品卡片的已拼xx万件。销量文本已拼1.2万件每次都不一样没法用文本匹配。但它旁边有一个固定的已拼标签。# 找已拼的父容器整个销量块然后在父容器里找具体数字//span[text()已拼]/..# 更直接通过已拼的父容器找数字span//span[text()已拼]/../span[classnum]六、完整实战批量提取小红书评论区数据# 小红书笔记评论区采集打开网页(https://www.xiaohongshu.com/explore/xxxxxxxxxx)等待元素出现(评论区容器,5秒)# 获取所有评论的相似元素列表# 捕获元素每条评论的外层容器# //div[classcomment-item]获取相似元素列表(评论列表)-评论列表 新建Excel-评论数据表 写入行数据(评论数据表,[序号,用户名,评论内容,发布时间])遍历列表(评论列表,当前评论):序号当前循环索引1# 方法1用preceding-sibling通过时间定位用户名# 时间元素有date class用户名在时间前面获取元素文本(当前评论,.//span[contains(class,date)]/preceding-sibling::a[1])-用户名# 方法2直接取评论内容有class可以直接定位获取元素文本(当前评论,.//span[classcontent])-评论内容# 获取发布时间有class可以直接定位获取元素文本(当前评论,.//span[contains(class,date)])-发布时间 写入行数据(评论数据表,[序号,用户名,评论内容,发布时间])导出表格(评论数据表,D:\小红书评论_20260609.xlsx)TEMU店群如何管理运营七、参照物定位的三个坑坑1以为兄弟位置固定结果DOM结构悄悄变了这在实际项目中很常见。电商平台隔几个月改版一次原来紧挨着的兄弟元素中间插了一个div。预防不要依赖[1]紧挨着的兄弟尝试用更大的偏移量或用父容器定位兜底。坑2不同浏览器渲染的DOM层级可能不一样Chrome的开发者工具和影刀内置浏览器的解析结果偶尔会有差异。解决方法用影刀自带的捕获元素看XPath不要直接抄Chrome开发者工具的XPath。坑3preceding-sibling::*[1]可能返回你没想到的元素*匹配所有标签包括br、img、空白文本节点。改善# ❌ 可能匹配到空白或换行//span[classdate]/preceding-sibling::*[1]# ✅ 指定标签类型//span[classdate]/preceding-sibling::a[1]//span[classdate]/preceding-sibling::div[1]八、速查三种定位方式的选择优先级优先级定位方式适用场景1最稳父容器定位目标有唯一文本或属性的父级订单号、商品ID2属性/文本直接匹配元素自身有id、唯一class、固定文本3兜底参照物定位目标没有唯一特征但邻居有我的习惯先尝试直接匹配不行就上父容器定位最后才考虑兄弟参照物。作者林焱本文为《影刀RPA学习手册》系列文章之一内容源于实操经验的整理与分享。