影刀RPA新手教程:字符串高级处理完全指南——截取、替换、拼接、分割与中文编码问题

📅 2026/7/5 9:27:19
影刀RPA新手教程:字符串高级处理完全指南——截取、替换、拼接、分割与中文编码问题
影刀RPA新手教程字符串高级处理完全指南——截取、替换、拼接、分割与中文编码问题本文作者林焱 | 转载请注明出处开篇案例字符串编码问题让我调试了整整一天去年做一个项目要用RPA处理从网页上抓下来的中文数据然后写入MySQL数据库。流程写好后本地测试一切正常。部署到服务器上跑中文全变成了乱码。报错信息UnicodeEncodeError: latin-1 codec cant encode characters in position 0-3我检查了MySQL的字符集utf8mb4检查了连接字符串charsetutf8mb4检查了Python文件的编码# -- coding: utf-8 --都没问题。最后发现原因是服务器上的Python是用ANSII模式运行的环境变量PYTHONIOENCODING没有设置导致标准输入输出用的是系统默认编码Windows上是GBK。在流程的开头加了这两行问题解决了importos os.environ[PYTHONIOENCODING]utf-8这次经历让我彻底搞懂了字符串编码的所有坑。本文所有案例围绕网页中文数据清洗与入库这条真实业务线展开。模块一安装与准备工作字符串处理是Python的基础功能不需要额外安装库。但要正确处理中文需要保证以下几点Python文件本身保存为UTF-8编码在编辑器里设置Python文件开头加# -*- coding: utf-8 -*-字符串前缀用u中文Python 3默认就是Unicode可不加文件读写时指定encodingutf-8关于Python环境和编码配置的详细教程在 home.linyan.cloud 有专门文章讲解。新建流程命名为字符串高级处理Demo。模块二元素定位从网页提取中文字符串从网页提取中文最怕的是提取到的字符串带了隐藏字符或者HTML实体。XPath提取中文文本//div[classproduct-name]/text()这个XPath提取产品名称但可能提取到的结果里包含\n换行、\t制表符、nbsp;HTML空格实体。处理HTML实体网页里的nbsp;lt;gt;等HTML实体需要用html模块处理importhtml text价格nbsp;lt;100元gt;cleanedhtml.unescape(text)print(cleaned)# 价格 100元注意html.unescape()不会去掉HTML标签只会把实体转成对应字符。如果要去掉HTML标签用re.sub()importre textp产品名称b无线耳机/b/pcleanedre.sub(r[^],,text)print(cleaned)# 产品名称无线耳机模块三变量与数据类型字符串的编码本质Python 3的字符串是Unicode这是很多人踩坑的根源。Python 2 vs Python 3影刀用的Python 3拼多多店群自动化报活动上架# Python 3影刀环境s中文# s是str类型本质是Unicodebs.encode(utf-8)# b是bytes类型s2b.decode(utf-8)# 从bytes转回strprint(type(s))# class strprint(type(b))# class bytes字符串编码问题的根本原理字符串在内存里是Unicode每个字符用若干字节表示。存储在文件里或者通过网络传输时需要编码成bytes用UTF-8、GBK等编码。如果编码和解码用的不是同一种编码就会出现乱码。# 正确流程text中文encodedtext.encode(utf-8)# 编码Unicode - bytesdecodedencoded.decode(utf-8)# 解码bytes - Unicode# 错误流程会导致乱码text中文encodedtext.encode(utf-8)decoded_wrongencoded.decode(gbk)# 用GBK解码UTF-8编码的内容 - 乱码print(decoded_wrong)# 输出乱码我当时踩过这个坑从GBK编码的Excel里读数据直接用UTF-8解码结果中文全乱了。模块四流程控制字符串处理的批量化字符串处理通常是对大量数据逐条处理。在影刀里用循环指令遍历用Python代码指令做字符串处理。批量清洗中文字符串的完整示例importreimporthtmldefclean_chinese_text(text): 综合清洗中文字符串 ifnotisinstance(text,str):return# 1. 解码HTML实体texthtml.unescape(text)# 2. 去掉HTML标签textre.sub(r[^],,text)# 3. 去掉不可见字符保留换行和制表符textre.sub(r[\x00-\x08\x0b\x0c\x0e-\x1f\x7f],,text)# 4. 去掉首尾空白包括全角空格texttext.strip().strip( )# 5. 把多个连续空白字符合并成一个空格textre.sub(r\s, ,text)returntext# 批量处理dirty_texts[ 产品名称无线耳机\n,p价格nbsp;199元/p,...]clean_texts[clean_chinese_text(t)fortindirty_texts]模块五网页自动化结合字符串处理从网页提取的字符串往往包含多余内容需要清洗后再使用。常见场景提取产品价格网页上的价格往往是这样的spanclasspricei/i199em.00/emspanclassunit/件/span/span用XPath提取//span[classprice]/text()得到的结果是[, 199, .00, /件]多个文本节点。需要拼接起来再提取数字部分importre# 拼接所有文本节点price_text.join(price_nodes)# 提取数字部分pricere.search(r[\d.],price_text)ifprice:amountfloat(price.group())print(f价格{amount})模块六数据处理——字符串截取字符串截取是最常用的操作。基础截取s影刀RPA新手教程# 从开头截取左截取lefts[:4]# 影刀RP# 从结尾截取右截取rights[-2:]# 教程# 从中间截取middles[2:4]# RPA按关键字截取defextract_after(text,delimiter): 截取分隔符后面的内容 比如extract_after(订单号DD001, ) - DD001 ifdelimiterintext:returntext.split(delimiter,1)[1]returndefextract_between(text,start,end): 截取两个分隔符之间的内容 比如extract_between(价格199元, , 元) - 199 ifstartintextandendintext:returntext.split(start,1)[1].split(end,1)[0]return# 更健壮的写法支持多个结果defextract_between_all(text,start,end):importre patternre.escape(start)r(.*?)re.escape(end)returnre.findall(pattern,text)模块七数据处理——字符串替换字符串替换比截取更常用因为数据清洗往往需要把某些字符统一。基础替换s订单号DD001金额199元# 简单替换ss.replace(元,)# 订单号DD001金额199# 替换多次ss.replace(,:).replace(,,)正则替换更强大importre text电话138-1234-5678备用139 8765 4321# 去掉电话号码里的横杠和空格cleanedre.sub(r[\s\-()],,text)print(cleaned)# 电话13812345678备用13987654321# 把多个连续空格替换成一个text产品 名称 无线耳机cleanedre.sub(r\s, ,text)print(cleaned)# 产品 名称 无线耳机替换里的坑转义字符# 错误想替换Windows路径里的反斜杠pathC:\\Users\\test# 下面的代码不会按预期工作因为\n是换行符# cleaned path.replace(\n, \\n) # 错误# 正确用原始字符串cleanedpath.replace(\\n,\\\\n)模块八数据处理——字符串拼接字符串拼接有几种方式性能差别很大。方式一用拼接少量字符串时用name张三age25info姓名name年龄age方式二用join拼接大量字符串时用性能最好# 拼接一个字符串列表parts[姓名,张三,年龄,25]info.join(parts)# 从列表推导式拼接words[影刀,RPA,新手,教程]title.join(words)# 影刀RPA新手教程方式三用format或 f-string推荐name张三age25# formatinfo姓名{}年龄{}.format(name,age)# f-stringPython 3.6最推荐infof姓名{name}年龄{age}我当时踩过这个坑在循环里用拼接大量字符串10万次拼接花了5秒。改成join后只用了0.1秒。模块九鼠标键盘与图像操作用OCR提取字符串有些字符串不在网页的HTML里而是嵌在图片里比如验证码、截图里的文字。这时需要用OCR把图片里的文字提取出来变成字符串再处理。用PaddleOCR推荐中文识别率高# 安装pip install paddlepaddle paddleocrfrompaddleocrimportPaddleOCR ocrPaddleOCR(use_angle_clsTrue,langch)defocr_image(image_path): 用PaddleOCR识别图片中的中文 resultocr.ocr(image_path,clsTrue)texts[]forlineinresult[0]:texts.append(line[1][0])# line[1][0]是识别到的文本return\n.join(texts)# 用法textocr_image(screenshot.png)print(fOCR识别结果\n{text})PaddleOCR的识别准确率比Tesseract高很多特别是中文。但PaddleOCR安装包很大约200MB如果环境不允许可以用在线OCR API。模块十进阶技能技能一中文分词关键词提取处理中文文本时经常需要把句子拆成词语。用jieba库安装pip install jiebaimportjieba text影刀RPA是一款优秀的自动化工具# 精确模式默认wordsjieba.lcut(text)print(words)# [影刀, RPA, 是, 一款, 优秀, 的, 自动化, 工具]# 搜索引擎模式分出更多可能的词wordsjieba.lcut_for_search(text)技能二字符串相似度计算判断两个字符串是否相似比如判断两个商品名称是不是同一个商品importdifflibdefstring_similarity(s1,s2): 计算两个字符串的相似度0-1之间 returndifflib.SequenceMatcher(None,s1,s2).ratio()# 测试print(string_similarity(无线耳机,无线耳机Pro))# 0.8print(string_similarity(无线耳机,有线耳机))# 0.67技能三中文拼音转换有时候需要按拼音排序中文或者把中文转成拼音做匹配# 安装pip install pypinyinfrompypinyinimportpinyin,lazy_pinyin# 获取拼音带声调print(pinyin(中文))# [[zhōng], [wén]]# 获取拼音不带声调用于排序或匹配print(lazy_pinyin(中文))# [zhong, wen]# 按拼音排序names[张三,李四,王五]sorted_namessorted(names,keylambdax:lazy_pinyin(x))print(sorted_names)# [李四, 王五, 张三]模块十一平台实战TEMU店群矩阵自动化运营核价报活动把字符串处理流程部署到影刀控制台时注意以下几点。要点一Python文件的编码声明在每个包含中文字符串的Python文件开头加上# -*- coding: utf-8 -*-虽然Python 3默认用UTF-8但加上这个声明是一个好习惯可以避免某些环境下的编码问题。要点二控制台日志里的中文显示如果控制台的日志里中文显示成\uXXXX需要设置Python的标准输出编码importsysimportio sys.stdoutio.TextIOWrapper(sys.stdout.buffer,encodingutf-8)sys.stderrio.TextIOWrapper(sys.stderr.buffer,encodingutf-8)要点三用任务监控查看字符串处理异常如果流程里处理字符串时报编码错误控制台的日志里会有UnicodeEncodeError或UnicodeDecodeError。看到这类错误首先检查文件的编码然后检查字符串的来源是从网页来的还是从Excel来的针对不同来源用不同的编码处理。模块十二系统联动与工程化规范工程化规范一字符串处理封装成工具函数不要把字符串处理的代码散落在流程各处。创建一个string_utils.py模块# string_utils.pyimportreimporthtmldefclean_text(text):综合清洗文本passdefextract_numbers(text):从文本中提取所有数字returnre.findall(r\d,text)defextract_chinese(text):提取文本中的中文字符returnre.findall(r[\u4e00-\u9fa5],text)defsafe_filename(text):把字符串转成安全的文件名importrereturnre.sub(r[\\/*?:|],_,text)# 在影刀的Python代码指令里# import sys# sys.path.append(C:/RPA_Scripts)# from string_utils import clean_text工程化规范二编码问题统一处理创建一个encoding_helper.py# encoding_helper.pyimportchardetdefdetect_encoding(binary_data): 检测二进制数据的编码 resultchardet.detect(binary_data)returnresult[encoding]defsafe_decode(binary_data,default_encodingutf-8): 安全解码先检测编码再用检测到的编码解码 如果失败用default_encoding detecteddetect_encoding(binary_data)try:returnbinary_data.decode(detected)except(UnicodeDecodeError,TypeError):returnbinary_data.decode(default_encoding,errorsignore)速查表字符串处理常用操作操作Python代码说明去掉首尾空格s.strip()包含\n\t等去掉左/右空格s.lstrip()/s.rstrip()替换s.replace(old, new)全部替换正则替换re.sub(pattern, new, s)支持复杂规则分割s.split(delimiter)返回列表按行分割s.splitlines()自动处理\n\r\n拼接.join(list)性能最好判断是否包含sub in s返回True/False大小写转换s.lower()/s.upper()中文分词jieba.lcut(s)需安装jieba报错排查指南报错UnicodeEncodeError: ‘gbk’ codec can’t encode character原因试图把Unicode字符串写入GBK编码的文件但字符串里有GBK不支持的字符比如emoji。解决打开文件时用encodingutf-8-sig或者encodingutf-8。报错SyntaxError: Non-UTF-8 code starting with原因Python文件本身不是UTF-8编码但里面包含了中文。解决在文件开头加# -*- coding: utf-8 -*-并且把文件保存为UTF-8编码。总结字符串高级处理的核心要点Python 3里字符串是Unicode、文件读写要指定encoding、中文处理用utf-8-sig、批量拼接用join不用。把这四个要点记住字符串处理就不会再踩编码的坑。更多字符串处理的高级技巧和完整代码访问 home.linyan.cloud 获取。#影刀RPA #RPA教程 #字符串处理 #编码问题 #Python教程作者林焱