采集商品列表页时,一页有30个商品。
问题:如果逐个捕获每个商品的标题、价格,要捕获90个元素,累死。
答案:用“父子元素定位”+“相似元素列表”——先定位父容器,再批量提取子元素数据。
一、核心概念
父元素:商品卡片的根容器(包裹整个商品信息)。
子元素:父元素内部的标题、价格、链接等。
相似元素列表:页面上所有同类父元素的集合(如30个商品卡片)。
影刀专属指令:
获取相似元素列表→ 拿到所有父元素循环相似元素列表→ 遍历每个父元素- 在循环内用相对定位提取子元素
二、完整操作流程(5步法)
步骤1:捕获父元素(商品卡片容器)
打开目标网页,F12查看商品列表的HTML结构。
找到包裹单个商品的最外层标签(通常是 div 或 li,有唯一class)。
示例(淘宝搜索页):
<div class="Item--root">

<div class="title">商品标题</div>
<div class="price">¥99</div>
<a href="/detail/123">详情</a>
</div>
捕获这个
div.Item--root 作为父元素,命名 product_card。
步骤2:捕获子元素(以父元素为参照)
关键操作:捕获子元素时,不要直接捕获页面上的元素,而是在已经捕获的父元素基础上,用相对路径定位子元素。
操作方法:
- 在左侧元素库里,右键
product_card→ 选择“捕获子元素”。 - 浏览器会打开,鼠标点击父元素内部的标题文字。
- 影刀自动生成相对路径(不会包含整个页面的绝对路径)。
# 自动生成的相对路径示例
# 父元素:product_card
# 子元素路径:.//div[@class='title']
# 开头的点 . 表示“从当前父元素开始”
如果手动编辑:
- 在子元素的XPath前加上
{父元素变量}//或./ - 例如:
{product_card}//div[@class='title']
步骤3:获取相似元素列表
用 获取相似元素列表 指令,把页面上所有商品卡片一次性拿下来。
操作:
- 拖入
获取相似元素列表指令。
2. 目标元素选
product_card(刚捕获的父元素)。
- 输出到变量,命名
product_list(类型:列表)。
参数设置:
- 匹配模式:默认“所有相似元素”
- 最大匹配数量:如果页面有分页加载,建议设50~100,不要设太大(会卡)
步骤4:循环相似元素列表
拖入 循环相似元素列表 指令,数据源选 {product_list}。
循环体内,用相对定位提取每个卡片的子元素数据。
# 循环相似元素列表配置
# 列表:{product_list}
# 当前元素变量名:current_card(系统自动生成,可改名)
# 循环体内部:
# 1. 获取元素文本(标题)
# 元素路径:{current_card}//div[@class='title']
# 输出到:{title}
# 2. 获取元素文本(价格)
# 元素路径:{current_card}//div[@class='price']
# 输出到:{price}
# 3. 获取元素属性(链接)
# 指令:获取元素属性
# 元素路径:{current_card}//a
# 属性名:href
# 输出到:{link}
# 4. 将 {title}、{price}、{link} 组成一行数据,写入Excel追加行
关键:所有子元素定位必须使用 {current_card} 作为起点,不要用绝对路径。
步骤5:翻页后重复
翻到下一页后,再次执行 获取相似元素列表(会重新获取新页面的元素),然后循环。
三、相对定位的三种写法
在循环体内,定位子元素有三种写法,都能用:
| 写法 | 示例 | 说明 |
|---|---|---|
| 用变量拼接 | {current_card}//div[@class='title'] | 最直观,推荐 |
| XPath格式 | .//div[@class='title'] | 点表示“当前节点” |
| 影刀相对路径 | 在元素库里捕获时选“相对路径”模式 | 系统自动处理 |
实操建议:
提前把标题、价格等子元素用“捕获子元素”方式存好(相对路径)。
循环内直接用这些子元素指令,把目标元素里的 {当前卡片} 手动改成变量名。
四、完整代码示例
# 采集淘宝商品列表(一页)
# 1. 打开网页(淘宝搜索页)
# 2. 获取相似元素列表
# 目标元素:product_card(已捕获的商品卡片父元素)
# 输出列表:product_list
# 3. 循环相似元素列表
# 列表:{product_list}
# 当前元素:card
# 3.1 获取元素文本(标题)
# 元素:card_title(已捕获的相对路径元素,内部是 ./div[@class='title'])
# 注意:需要在指令详情里把“目标元素”的动态变量设为 {card}
# 或者手动写元素路径:{card}//div[@class='title']
# 输出到:title
# 3.2 获取元素文本(价格)
# 元素路径:{card}//div[@class='price']
# 输出到:price
# 3.3 获取元素属性(链接)
# 元素:{card}//a
# 属性名:href
# 输出到:link
# 3.4 追加行到Excel
# 内容:[{title}, {price}, {link}]
# 4. 循环结束
# 5. 翻页后重复步骤2-4
五、3个关键易错点
易错1:子元素捕获时用了绝对路径
错误:捕获子元素时,直接点击页面上的标题,生成了 //div[@class='title'](从根节点开始)。
在循环内用这个元素,它会找到页面上第一个标题,而不是当前卡片的标题。
解决:必须用相对路径。重新捕获:右键父元素 → “捕获子元素”,或手动在路径前加 {current_card}//。
易错2:获取相似元素列表后,页面滚动了
问题:先获取列表,然后滚动页面到底部加载更多,原来的列表变量不会自动更新。
解决:滚动后需要重新执行 获取相似元素列表。
易错3:循环内频繁操作Excel导致速度慢
问题:一页30个商品,每个都写入Excel,循环30次写操作。
解决:把一页的数据先存到一个临时列表 {page_data},翻页前一次性写入。
# 优化写法
# 在循环相似元素列表内,不直接写入Excel
# 而是把每行数据追加到临时列表 {page_rows}
# 循环结束后,用“列表循环”一次性写入Excel
六、影刀专属操作清单
| 操作 | 精确指令 | 关键设置 |
|---|---|---|
| 捕获父元素 | 捕获元素按钮 → 选中容器 | 命名如 product_card |
| 捕获子元素 | 右键父元素 → 捕获子元素 | 自动生成相对路径 |
| 获取相似元素列表 | 获取相似元素列表 | 目标元素选父元素 |
| 循环相似元素列表 | 循环相似元素列表 | 列表变量、当前元素变量 |
| 相对定位写法 | 在元素路径中写 {当前变量}//子路径 | 注意双斜杠 |
| 获取元素属性 | 获取元素属性 | 属性名如 href、src |
版本差异:社区版 获取相似元素列表 在元素数量超过100时可能超时,建议分页处理。
创业版支持异步获取,速度更快。
常见问题速查
| 问题 | 原因 | 解决方法 |
|---|---|---|
| 循环内获取子元素总是取到第一个 | 子元素是绝对路径 | 改成 {current_card}//子路径 |
| 获取相似元素列表只拿到几个 | 页面未滚动,只加载了可见部分 | 先滚动到底部再获取 |
| 子元素捕获时“捕获子元素”灰色不可点 | 没有选中父元素 | 先在元素库选中父元素 |
| 循环时报“无效的当前元素” | 列表变量为空 | 获取列表后用“输出日志”检查长度 |
相对路径写 ./ 无效 | 影刀版本差异 | 改用 {变量}// 写法 |
推荐资源
- 影刀官方帮助中心:《相似元素列表——批量采集的核心》
- 影刀学院视频:《父子元素定位与列表采集实战》(约18分钟)
- 模板搜索:下载“电商商品列表采集”模板,看它的父子元素结构
最后一句:父子元素+相似元素列表,是批量采集的黄金组合。
记住三步:先捕获父容器 → 获取相似元素列表 → 循环内用 {当前卡片} 相对定位。
练熟这个,一页100个商品也能轻松拿下。
作者:林焱
本文为《影刀RPA学习手册》系列文章之一,内容源于实操经验的整理与分享。
