如何用Python读取PDF文件并生成含指定字段的DataFrame?
Python读取PDF生成含Locality、Reference、Price的DataFrame方案
1. 工具选择优先用pdfplumber
相比PyPDF2,pdfplumber能更好保留PDF的文本布局,减少提取后内容乱序的问题,适合处理结构化的PDF内容。同时搭配pandas构建DataFrame,re做正则匹配。
先安装依赖:
pip install pdfplumber pandas
2. 核心实现步骤
步骤1:提取PDF文本并分割条目
先逐页提取PDF文本,再根据PDF里的条目分隔规则(比如空行、特定分隔符)把每页内容分割成单个条目块,避免跨条目的正则匹配错误。
步骤2:针对每个条目块提取字段
针对每个条目块,用正则匹配目标字段。如果之前正则失败,大概率是没考虑字段的上下文边界(比如字段结束的位置),或者格式变体(比如价格的符号、千分位分隔符)。
步骤3:构建DataFrame
把所有提取到的字段存入列表,再转成DataFrame。
3. 示例代码
假设你的PDF中每个条目是类似以下的结构化块(空行分隔):
Locality: Madrid Centro
Reference: PROP-789
Price: 250.000 €
代码实现:
import pdfplumber import pandas as pd import re # 自定义正则匹配模式,根据你的PDF实际格式调整 field_patterns = { "Locality": re.compile(r"Locality:\s*(.*?)\s*(?=Reference|Price|\Z)", re.DOTALL), "Reference": re.compile(r"Reference:\s*(.*?)\s*(?=Locality|Price|\Z)", re.DOTALL), "Price": re.compile(r"Price:\s*([\d,.]+)\s*([€$])", re.DOTALL) } extracted_data = [] # 遍历PDF所有页面 with pdfplumber.open("target.pdf") as pdf: for page in pdf.pages: page_text = page.extract_text() if not page_text: continue # 按空行分割成单个条目块,过滤空内容 entries = [block.strip() for block in page_text.split("\n\n") if block.strip()] for entry in entries: row = {} # 逐个匹配字段 for field, pattern in field_patterns.items(): match_result = pattern.search(entry) if not match_result: row[field] = None continue if field == "Price": # 拼接价格数值和符号 row[field] = f"{match_result.group(2)}{match_result.group(1)}" else: row[field] = match_result.group(1).strip() extracted_data.append(row) # 转换为DataFrame result_df = pd.DataFrame(extracted_data) print(result_df.head())
4. 常见问题调整
- 条目分割不对:如果条目不是空行分隔,比如用
---或者"Property Details"标题分隔,修改page_text.split("你的分隔符")即可。 - 字段名不一致:比如PDF里是
Localité而不是Locality,直接修改正则里的字段名。 - 价格格式复杂:比如带货币符号在前面($250,000),调整Price的正则为
r"([€$])\s*([\d,.]+)"。 - 扫描版PDF:如果是无法复制文本的扫描件,需要先转图片再OCR,搭配
pdf2image和pytesseract:
先把PDF转成图片,再用pip install pdf2image pytesseractpytesseract.image_to_string()提取文本,后续流程同上。
内容的提问来源于stack exchange,提问作者Ulises Sosa
相关产品推荐
相关产品推荐

