影刀RPA进阶教程:Python代码指令做数据清洗——正则提取与字符串处理

影刀采集到的数据经常是“价格:¥49.00元”“销量1234件已售”,带着各种前缀后缀。直接用这些数据去分析或写入表格,还得手动处理。

影刀的“执行Python代码”指令能直接做数据清洗。 不用另外装环境,在流程里嵌一段Python,把“¥49.00元”变成49.00,把“1234件”变成1234。

picture.image


什么时候用Python清洗

picture.image

场景影刀自带指令Python方案
提取数字没有现成指令正则一行搞定
去除空格/特殊字符可以用“替换文本”,但多个字符要多次正则一个模式

picture.image | 拆分字符串 | 没有 | .split() | | 批量清洗列表 | 要写循环 | 列表推导式一行 | | JSON解析 | 没有 | json.loads() |

一句话:凡是涉及模式匹配、复杂字符串处理,就用Python。

picture.image


第一步:放置“执行Python代码”指令

picture.image 操作:

  1. 右侧指令面板搜索“执行Python代码”
  2. 拖入画布
  3. 点亮右上角的Python图标(否则指令是灰色的)
  4. 在代码框里写Python脚本

picture.image 5. 设置输入变量和输出变量

界面说明:

  • 输入变量:把影刀变量传进Python(字典形式)
  • 输出变量:把Python结果传回影刀(支持字符串、数字、列表、字典)

picture.image

⚠️ 踩坑:不点亮Python图标,代码写了也不执行。很多新手卡在这一步。


picture.image

核心语法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()  # "件"
    
![picture.image](https://p6-volc-community-sign.byteimg.com/tos-cn-i-tlddhu82om/1e4bf44367fa4f6886c0931708562a31~tplv-tlddhu82om-image.image?=&rk3s=8031ce6d&x-expires=1781732368&x-signature=4ReXhH3%2BXGItGiiBRQcJXsZmMPM%3D)
else:
    number = 0
    unit = ""

# 可以返回字典
result = {"number": number, "unit": unit}

影刀调用时:输出变量${清洗结果}是字典,再用获取字典值numberunit


picture.image

核心语法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

  1. 代码框里写print(变量),输出会显示在影刀的“运行日志”中
  2. raise Exception(变量)强制报错,看变量值
  3. 先在本地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学习手册》系列文章之一,内容源于实操经验的整理与分享。

0
0
0
0
评论
未登录
暂无评论