Python/pandas中如何仅移除字符串乱码坏字符保留其余有效内容
问题根因
你碰到的–类乱码属于典型的编码解析错误:PDF内的文本以UTF-8多字节编码存储,但Camelot依赖的pdfminer组件在部分场景下会默认使用CP1252(Latin-1)单字节编码解析内容,导致原本单个的多字节字符被拆成多个无意义的乱码字符,并非文本本身存在无效坏字符。
优先方案:读取环节指定编码从源头避免乱码
不需要事后清洗,直接在Camelot读取PDF时传入正确的编码参数,就能彻底解决这类问题,无任何内容损失:
import camelot import pandas as pd # 按你实际使用的解析模式调整flavor参数,lattice对应有线表格,stream对应无线表格 tables = camelot.read_pdf( "target.pdf", pages="1-end", flavor="lattice", encoding="utf-8" ) # 合并所有读取到的表格为DataFrame df = pd.concat([t.df for t in tables], ignore_index=True)
如果指定utf-8后仍有少量乱码,可以根据PDF的实际生成编码替换为utf-8-sig(带BOM的UTF-8文件)或gb18030(部分国内生成的中文PDF)。
备选方案:已读取内容的通用清洗逻辑
如果你已经完成全量PDF读取、不想重新跑解析流程,可以用编码反转的方式修复乱码,完全不需要手动枚举需要保留的特殊字符,也不会误删正常内容:
def clean_mojibake(text): if not isinstance(text, str): return text try: # 把乱码按CP1252编码转回原始字节,再用UTF-8解码还原正确字符 return text.encode("cp1252").decode("utf-8") except (UnicodeEncodeError, UnicodeDecodeError): # 遇到无法反转的异常字符,直接过滤无效编码字节即可 return text.encode("utf-8", errors="ignore").decode("utf-8", errors="ignore") # 对DataFrame所有字段批量执行清洗 df = df.applymap(clean_mojibake)
用你给出的示例文本测试,清洗后结果为123Rise <strong>–</strong> Tower & Troe's Mech<strong>–</strong>,所有原有文本、标签、标点符号都完整保留,不会出现正则方案误删特殊字符、维护成本高的问题。
不建议继续使用白名单正则过滤的方案:PDF中可能存在希腊字母、数学运算符、特殊标点等各类符号,手动枚举不仅工作量大,也很容易漏掉需要保留的内容,编码反转的方案对这类场景的乱码修复率接近100%,没有额外维护成本。
内容的提问来源于stack exchange,提问作者maddy_novice
相关产品推荐
相关产品推荐

