非结构化PDF数据提取求助:Tabula失效,需获取艇级及出发时间
非结构化PDF数据提取求助:获取艇级和出发时间并导入Pandas DataFrame
我尝试从一份非结构化PDF中提取数据,目标是获取出发信息(艇级和出发时间),但因为数据不在结构化框内,Tabula这类工具无法正常工作。我希望把PDF里的信息导入Pandas DataFrame,当前使用的代码如下:
source = 'https://d3fpn4c9813ycf.cloudfront.net/pdfDocuments/WCH_2022_1/WCH_2022_1_ROWMSCULL1-L----------HEAT000100--_C77X5402.PDF' pandas_options={'header': None} data = tb.read_pdf(source, pages = 'all', pandas_options={'header': None}) data = data[0] data = pd.DataFrame(data) headers = data.iloc[0]
可行解决思路
1. OCR提取文本后正则解析
针对无结构化的PDF,先通过OCR转成纯文本,再用正则匹配目标信息:
- 安装依赖:
pip install pdf2image pytesseract pandas - 示例代码:
from pdf2image import convert_from_path import pytesseract import pandas as pd import re # 将PDF转为图片并提取文本 images = convert_from_path(source) full_text = "" for img in images: full_text += pytesseract.image_to_string(img) # 根据PDF实际文本格式调整正则规则,示例匹配类似"M1x - 10:05:00"的内容 pattern = r"([A-Z0-9]+x?) - (\d{2}:\d{2}:\d{2})" matches = re.findall(pattern, full_text) # 转为DataFrame df = pd.DataFrame(matches, columns=["艇级", "出发时间"]) print(df)
2. 用PyMuPDF直接提取文本
PyMuPDF(fitz)对非结构化PDF的文本提取精度更高:
- 安装依赖:
pip install pymupdf pandas - 示例代码:
import fitz import pandas as pd import re doc = fitz.open(source) full_text = "" for page in doc: full_text += page.get_text() # 正则匹配目标内容,规则根据实际文本调整 pattern = r"([A-Z0-9]+x?) - (\d{2}:\d{2}:\d{2})" matches = re.findall(pattern, full_text) df = pd.DataFrame(matches, columns=["艇级", "出发时间"]) print(df)
3. 调整Tabula参数尝试
如果PDF存在隐性表格结构,可切换stream模式强制按行提取,再手动清洗:
import tabula as tb import pandas as pd import re data = tb.read_pdf(source, pages='all', pandas_options={'header': None}, stream=True) # 筛选包含时间或艇级关键词的行 filtered_rows = [] for row in data[0].values: if re.search(r"\d{2}:\d{2}:\d{2}", str(row)): filtered_rows.append(row) df = pd.DataFrame(filtered_rows, columns=["艇级", "出发时间"])
内容的提问来源于stack exchange,提问作者Dan Geneau
相关产品推荐
相关产品推荐

