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

如何用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:
    pip install pdf2image pytesseract
    
    先把PDF转成图片,再用pytesseract.image_to_string()提取文本,后续流程同上。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 00:01:06