
影刀RPA新手教程父子元素定位与相似元素列表的完整操作流程做电商数据采集时页面上的商品卡片长得一模一样——标题、价格、销量、店铺名每个卡片结构完全相同。你要一条一条采不可能逐个捕获。影刀里专门有一类指令处理这种场景。但用之前你得先搞懂两件事怎么定位到这一组卡片相似元素列表以及怎么从每个卡片里提取具体字段父子定位。这两个概念绑在一起拆不开。一、什么情况下用相似元素列表先判断你的页面属于哪种情况页面结构该用什么同一个页面有多个结构完全相同的区块商品卡片、搜索结果行、评论条目相似元素列表只有一个元素没有同类重复普通元素捕获多个元素但不是相同结构比如顶部导航栏侧边栏正文区分别单独捕获淘宝搜索结果页、拼多多商品列表、小红书笔记流——典型的第一种情况。二、捕获相似元素列表的正确姿势步骤1先捕获任意一个卡片点击影刀顶部捕获元素鼠标移到第一个商品卡片上。注意不要在整个卡片外围点而是点卡片的外层容器——那个刚好包住标题价格图片的div。影刀会生成一个XPath定位。步骤2在详情面板勾选相似元素捕获后右侧详情面板有一个开关叫获取相似元素列表。把它的开关打开蓝色。点击验证按钮影刀会用这个XPath去找所有匹配的元素弹窗显示找到了几条。如果找到了正确的数量和页面上看到的卡片数一致说明定位OK。步骤3确认相似度生效范围店群矩阵自动化突破运营极限如果验证结果只有1条而不是N条问题出在XPath太精确了——它独一定位到了第一个卡片。解决办法在第三部分讲。三、为什么你的XPath只定位到一个元素这是最高频的问题。影刀的相似元素列表依赖XPath定位到一个父容器然后自动找所有同类。但如果你的XPath里用了具体的文本或索引就会锁死。错误示例# ❌ 捕获元素第1个商品卡片索引锁死了(//div[classgoods-card])[1]正确写法# ✅ 捕获元素商品卡片容器不带索引//div[classgoods-card]# ✅ 如果class相同但结构不同加属性过滤//div[classgoods-cardanddata-spm]去掉括号和[N]索引让XPath定位到一类而非一个。四、父子元素定位从卡片里取字段拿到相似元素列表后下一个问题是怎么从每个卡片里取出商品标题、“价格”、销量这些子元素影刀提供了两种方式方式A直接在画布里用获取元素文本拖入获取相似元素列表得到商品卡片列表。再拖入遍历列表然后对每条循环拖一个获取元素文本在元素参数里选父子定位模式父元素选当前循环项即当前商品卡片子元素路径写这个卡片内部的XPath比如标题的class# 捕获元素商品卡片内的标题相对路径以卡片为父容器.//div[classtitle]# 捕获元素商品卡片内的价格.//span[classprice]/em# 捕获元素商品卡片内的销量.//span[classsales]注意那个点.——.//表示从当前父容器开始向下找不加点就是从整个页面开始找会把所有卡片的标题都返回。方式B用Python代码指令一条条取在Python图标里写更灵活的逻辑# 在Python代码指令中处理相似元素列表importwin32com.client# 假设前面的指令已将元素列表传给Python# 遍历每个卡片提取子元素foridx,cardinenumerate(card_list):# card_list是前一步获取的标题card.FindElementByXPath(.//div[classtitle]).Text 价格card.FindElementByXPath(.//span[classprice]).Text 销量card.FindElementByXPath(.//span[classsales]).Text result_list.append([标题,价格,销量])# 追加到结果列表新手更推荐方式A纯影刀指令操作不依赖Python环境。五、完整实战案例拼多多搜索结果采集# 拼多多商品搜索→列表采集→写表格 完整流程打开网页(https://mobile.yangkeduo.com/search?keyword连衣裙)等待元素出现(搜索页面标识,5秒)# 第一步获取所有商品卡片的相似元素列表# 捕获元素商品卡片外层容器# //div[data-active0]获取相似元素列表(商品卡片列表)-卡片列表# 第二步创建结果表新建Excel-采集结果 写入行数据(采集结果,[序号,商品名称,价格,销量万件,店铺名])# 第三步遍历每个卡片提取子元素遍历列表(卡片列表,当前卡片):序号当前循环索引1# 父子定位从当前卡片找标题获取元素文本(当前卡片,.//h3)-商品名# 父子定位从当前卡片找价格获取元素文本(当前卡片,.//span[classprice])-商品价格# 父子定位从当前卡片找销量获取元素文本(当前卡片,.//span[classsales])-商品销量# 父子定位从当前卡片找店铺名获取元素文本(当前卡片,.//span[classshop-name])-店铺名# 写入结果表写入行数据(采集结果,[序号,商品名,商品价格,商品销量,店铺名])# 第四步保存到文件导出表格(采集结果,D:\拼多多连衣裙数据_20260609.xlsx)关键点循环里的四个获取元素文本用的都是父子定位模式——父元素是当前卡片子元素路径是以点开头的相对XPath。这个点不能漏。六、当相似元素列表数量不对时问题1只找到1条但页面上明明有20个原因XPath太具体定位到了唯一元素。修复去掉XPath里的索引[N]和具体文本匹配。# ❌ 只有一个结果//div[classcard][3]# ✅ 去掉索引返回所有//div[classcard]问题2找到了30条但页面上只有20个temu店群自动化报活动案例原因有些隐藏的卡片也被算进去了display:none的备选卡片。修复加过滤条件排除隐藏元素。# 排除隐藏的元素//div[classcardandnot(contains(style,display:none))]问题3采集到一半报错元素已失效原因翻页后页面重渲染之前获取的相似元素列表对象失效了。修复每次翻页后重新获取相似元素列表不要复用旧对象。条件循环(True):获取相似元素列表(商品卡片列表)-卡片列表# 每页重新获取遍历列表(卡片列表,当前卡片):提取数据...判断元素是否存在(下一页按钮)如果 结果为真:点击元素(下一页按钮)等待元素出现(列表加载完成标记,3秒)否则:跳出循环七、父子定位的注意事项子元素路径里不要有绝对定位# ❌ 绝对路径——父容器变化就失效//div[1]/div[2]/div[3]//h3# ✅ 相对路径——只描述卡片内部结构.//h3[classtitle]不要把获取元素文本和获取元素属性搞混获取元素文本→ 拿到元素里显示的文字比如 “连衣裙夏季新款 ¥128”获取元素属性→ 拿到元素的HTML属性值比如href、src、data-id商品链接、图片地址这些用属性获取标题和价格用文本获取。八、易错速查错误后果正确做法XPath带了[N]索引只返回1条去掉索引子元素路径忘加.拿到的是整个页面第一个匹配写.//而非//翻页后复用旧列表报元素已失效每页重新获取相似元素列表隐藏元素也被计入了数据重复加not(contains(style,‘display:none’))过滤父子定位选了错误的父元素提取的字段串行确认父元素就是卡片的外层容器作者林焱本文为《影刀RPA学习手册》系列文章之一内容源于实操经验的整理与分享。