影刀采集到的数据经常是“价格:¥49.00元”“销量1234件已售”,带着各种前缀后缀。直接用这些数据去分析或写入表格,还得手动处理。
影刀的“执行Python代码”指令能直接做数据清洗。 不用另外装环境,在流程里嵌一段Python,把“¥49.00元”变成49.00,把“1234件”变成1234。
什么时候用Python清洗
| 场景 | 影刀自带指令 | Python方案 |
|---|---|---|
| 提取数字 | 没有现成指令 | 正则一行搞定 |
| 去除空格/特殊字符 | 可以用“替换文本”,但多个字符要多次 | 正则一个模式 |
| 拆分字符串 | 没有 |
.split() |
| 批量清洗列表 | 要写循环 | 列表推导式一行 |
| JSON解析 | 没有 | json.loads() |
一句话:凡是涉及模式匹配、复杂字符串处理,就用Python。
第一步:放置“执行Python代码”指令
操作:
- 右侧指令面板搜索“执行Python代码”
- 拖入画布
- 点亮右上角的Python图标(否则指令是灰色的)
- 在代码框里写Python脚本
5. 设置输入变量和输出变量
界面说明:
- 输入变量:把影刀变量传进Python(字典形式)
- 输出变量:把Python结果传回影刀(支持字符串、数字、列表、字典)
⚠️ 踩坑:不点亮Python图标,代码写了也不执行。很多新手卡在这一步。
核心语法1:正则提取数字
场景:采集到的价格是“¥49.00”,要提取49.00。
Python代码:
# 输入变量:raw_price(字符串),从影刀传入
# 输出变量:clean_price(数字或字符串)
import re
# 提取数字和小数点
match = re.search(r'[\d.]+', raw_price)
if match:
clean_price = float(match.group()) # 转成数字
else:
clean_price = 0
影刀中的配置:
- 输入变量:
{"raw_price": ${原始价格}} - 输出变量:
${清洗后价格}
效果:“¥49.00” → 49.00(数字类型,可以算总和)。
核心语法2:提取数字后的单位
场景:销量“1234件已售”,要提取1234和单位“件”。
Python代码:
import re
# 输入:raw_sales = "1234件已售"
# 输出:数字和单位分开
match = re.search(r'(\d+)([^0-9]+)', raw_sales)
if match:
number = int(match.group(1)) # 1234
unit = match.group(2).strip() # "件"

else:
number = 0
unit = ""
# 可以返回字典
result = {"number": number, "unit": unit}
影刀调用时:输出变量${清洗结果}是字典,再用获取字典值取number和unit。
核心语法3:去除所有非数字字符
场景:手机号采集成了“手机:138-1234-5678”,要去掉非数字。
Python代码:
import re
# 输入:raw_phone = "手机:138-1234-5678"
clean_phone = re.sub(r'\D', '', raw_phone) # \D 表示非数字
# 输出:"13812345678"
⚠️ 注意:\D匹配所有非数字字符,包括汉字、标点、空格。一行搞定。
核心语法4:拆分带分隔符的字符串
场景:采集到多个标签“美妆,护肤,防晒”,要拆成列表。
Python代码:
# 输入:raw_tags = "美妆,护肤,防晒"
tag_list = raw_tags.split(',') # ['美妆', '护肤', '防晒']
# 去掉每个标签的空格
tag_list = [t.strip() for t in raw_tags.split(',')]
批量清洗列表:
# 输入:price_list = ["¥49", "¥99", "¥129"]
clean_list = [float(re.search(r'[\d.]+', p).group()) for p in price_list if re.search(r'[\d.]+', p)]
# 输出:[49.0, 99.0, 129.0]
核心语法5:从URL中提取参数
场景:商品链接是https://detail.tmall.com/item.htm?id=123456789&spm=xxx,要提取id。
Python代码:
import re
# 输入:url
match = re.search(r'id=(\d+)', url)
if match:
product_id = match.group(1)
else:
product_id = ""
或用正则更精确:
import re
from urllib.parse import urlparse, parse_qs
# 方法2:用urllib(更稳定)
parsed = urlparse(url)
params = parse_qs(parsed.query)
product_id = params.get('id', [''])[0]
核心语法6:处理JSON数据
场景:调用API返回的JSON字符串,要解析成字典。
Python代码:
import json
# 输入:json_str = '{"code":200,"data":{"title":"鼠标垫"}}'
data = json.loads(json_str)
title = data.get('data', {}).get('title', '')
# 输出:title
影刀里返回字典:Python代码输出data,影刀用获取字典值逐层取。
实战:完整的数据清洗子流程
# D_清洗商品数据子流程
流程参数:
- 输入:原始数据(字典,包含标题、价格、销量、链接)
- 输出:清洗后数据(字典)
执行Python代码:
输入变量:{"raw": ${原始数据}}
输出变量:${clean}
代码:
import re
def clean_price(price_str):
match = re.search(r'[\d.]+', price_str)
return float(match.group()) if match else 0.0
def clean_sales(sales_str):
match = re.search(r'(\d+)', sales_str)
return int(match.group()) if match else 0
def clean_title(title_str):
# 去除前后空格和换行
return title_str.strip().replace('\n', ' ')
raw = input_data.get('raw', {})
clean = {
'title': clean_title(raw.get('title', '')),
'price': clean_price(raw.get('price', '0')),
'sales': clean_sales(raw.get('sales', '0')),
'link': raw.get('link', '').strip()
}
主流程调用:
调用子流程:D_清洗商品数据
输入参数:原始数据 = ${采集到的原始行}
输出参数:清洗后数据 = ${干净数据}
# 然后写入表格
追加行到表格(行数据=[${干净数据.title}, ${干净数据.price}, ${干净数据.sales}])
Python代码调试技巧
在影刀里调试Python:
- 代码框里写
print(变量),输出会显示在影刀的“运行日志”中 - 用
raise Exception(变量)强制报错,看变量值 - 先在本地Python环境(如PyCharm、Jupyter)调通,再复制进影刀
常用调试代码:
# 打印输入变量(影刀运行日志里看)
print("输入数据:", input_data)
# 打印中间结果
print("提取的数字:", match.group())
# 如果报错,打印具体错误
try:
# 你的代码
except Exception as e:
print("错误:", e)
raise # 重新抛出,让影刀捕获
⚠️ 踩坑:影刀里的Python不支持input()交互,也不支持打开外部窗口(如matplotlib)。只做数据处理,不做界面交互。
常见问题速查
| 问题 | 原因 | 解决方法 |
|---|---|---|
| Python图标灰色点不亮 | 流程没保存 | 先保存流程,再点亮 |
| 代码运行报“模块不存在” | 缺少import | 在代码里加import re等 |
| 输出变量是空的 | 忘了给输出变量赋值 | Python最后必须给输出变量名赋值 |
| 正则匹配不到任何内容 | 模式写错了 | 用本地Python先测正则 |
| 列表输出到影刀变成字符串 | Python返回了非列表类型 | 确保return的是列表,用type()检查 |
| 大量数据清洗很慢 | 循环内调用Python | 尽量在Python内批量处理,避免影刀循环每行调一次 |
性能建议
❌ 慢的写法(每行都调Python):
列表循环(1000行):
执行Python代码(清洗单行)
✅ 快的写法(列表整体传入,Python内批量处理):
# 先把所有原始数据攒成列表
设置变量(原始数据列表 = [])
列表循环:
追加元素到列表(原始数据列表, 当前行原始数据)
# 一次Python处理全部
执行Python代码:
输入:{"raw_list": ${原始数据列表}}
输出:${清洗后列表}
# Python内用列表推导式批量处理
实测:1000条数据,逐行调Python约15秒,批量处理约2秒。
版本差异
- 社区版/创业版:Python指令完全可用
- 第三方库支持:不支持pip安装,只能用Python标准库(re、json、math、datetime、random等)
- 如果需要pandas、numpy,用不了。但大部分数据清洗用标准库+正则就够了
推荐学习:影刀官方文档的“Python代码指令”章节,有常见清洗模板。另外菜鸟教程的Python正则表达式部分,花30分钟学一下,以后清洗数据不求人。
作者:林焱
本文为《影刀RPA学习手册》系列文章之一,内容源于实操经验的整理与分享。
