pdfminer提取PDF表格文本按列分组 无法解析指定列数据问题咨询
可行解决方法
方案1:换用专门的PDF表格提取工具(优先推荐)
pdfminer的extract_text接口默认按文本块纵向坐标排序输出,天生不适合提取结构化表格内容。推荐使用专门处理PDF表格的camelot库,可直接识别表格行列结构,精准提取所需两列。
- 第一步:安装依赖
pip install camelot-py[cv] openpyxl - 第二步:使用示例代码
import camelot import pandas as pd # 读取PDF中的所有表格 tables = camelot.read_pdf('Portfolio.pdf', pages='all') # 合并所有表格的所需两列 result_df = pd.DataFrame(columns=['Security Name', 'Market Value in Deal CCY/Market Value in Fund CCY']) for table in tables: # 取表格的第0行作为表头匹配,找到对应列的索引 header = table.df.iloc[0].tolist() try: name_col = header.index('Security Name') value_col = header.index('Market Value in Deal CCY/Market Value in Fund CCY') except ValueError: # 跳过无对应表头的表格 continue # 提取当前表格的目标列,跳过表头行 temp_df = table.df.iloc[1:][[name_col, value_col]] temp_df.columns = result_df.columns result_df = pd.concat([result_df, temp_df], ignore_index=True) # 导出到Excel result_df.to_excel('提取结果.xlsx', index=False)
如果camelot识别效果不佳,可替换为tabula-py库,逻辑基本一致,安装命令为pip install tabula-py。
方案2:基于已提取的字符串正则解析
如果必须使用你当前已经提取到的PDFtext变量内容解析,可以通过两列内容的特征做正则匹配配对:
- Security Name列内容特征:多为字母、数字、空格、特殊符号组成的证券名称,无纯数字/货币符号开头的特征
- Market Value列内容特征:多为带千分位逗号、小数点的数字,部分带有货币符号前缀
示例解析代码:
import re import pandas as pd # 匹配市值的正则规则,可根据实际内容调整 value_pattern = re.compile(r'^[A-Z]{0,3}\s?\d{1,3}(?:,\d{3})*(?:\.\d{2})?$') # 先把提取的文本按换行分割 lines = [line.strip() for line in PDFtext.split('\n') if line.strip()] names = [] values = [] temp_name = [] for line in lines: if value_pattern.match(line): # 匹配到市值行,把之前攒的证券名合并 if temp_name: names.append(' '.join(temp_name)) values.append(line) temp_name = [] else: # 未匹配到市值,判定为证券名内容(支持跨行的证券名) temp_name.append(line) # 生成DataFrame导出Excel result_df = pd.DataFrame({ 'Security Name': names, 'Market Value in Deal CCY/Market Value in Fund CCY': values }) result_df.to_excel('提取结果.xlsx', index=False)
注意正则规则需要根据你实际提取到的文本格式微调,适配你PDF中的市值格式即可。
内容的提问来源于stack exchange,提问作者Shri
相关产品推荐
相关产品推荐

