You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 &amp; Troe's Mech<strong>–</strong>,所有原有文本、标签、标点符号都完整保留,不会出现正则方案误删特殊字符、维护成本高的问题。

不建议继续使用白名单正则过滤的方案:PDF中可能存在希腊字母、数学运算符、特殊标点等各类符号,手动枚举不仅工作量大,也很容易漏掉需要保留的内容,编码反转的方案对这类场景的乱码修复率接近100%,没有额外维护成本。

内容的提问来源于stack exchange,提问作者maddy_novice

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 17:06:26