Python读取在线PDF遇OSError及提取表格数据至列的求助
解决方案
1. 修复在线PDF读取错误
PyPDF2 的 PdfReader 不支持直接传入 HTTP URL,必须先将在线PDF下载到本地内存或磁盘。可以用 requests 库先获取PDF内容,再通过字节流传给 PdfReader:
import PyPDF2 import pandas as pd import requests from io import BytesIO from PyPDF2 import PdfReader # 下载在线PDF到内存 url = "http://www.meteo.gov.lk/images/mergepdf/20221004MERGED.pdf" response = requests.get(url) # 将响应内容转为字节流 pdf_stream = BytesIO(response.content) # 读取PDF reader = PdfReader(pdf_stream) text = "" for page in reader.pages: text += page.extract_text() + "\n"
2. 提取表格到Pandas列
直接用PyPDF2提取的纯文本很难拆分表格结构,推荐用专门处理PDF表格的库,比如 tabula-py(基于Java,需提前安装Java环境)或 camelot。以下是具体实现:
用tabula-py提取表格
步骤1:安装依赖
pip install tabula-py requests
注意:tabula-py 需要Java 8+环境,若未安装需先配置Java环境变量。
步骤2:提取第一页表格代码
import tabula url = "http://www.meteo.gov.lk/images/mergepdf/20221004MERGED.pdf" # 提取第一页的所有表格,返回DataFrame列表 tables = tabula.read_pdf(url, pages=1, multiple_tables=True) # 取第一个表格(如果存在) if tables: first_table = tables[0] print(first_table) # 可直接保存为CSV或进一步处理 first_table.to_csv("first_table.csv", index=False)
用camelot提取表格
步骤1:安装依赖
pip install camelot-py[cv]
步骤2:提取第一页表格代码
import camelot tables = camelot.read_pdf(url, pages=1) first_table = tables[0].df print(first_table)
这两个工具都能直接解析PDF中的表格结构,生成带列的Pandas DataFrame,比手动拆分纯文本高效得多。
内容的提问来源于stack exchange,提问作者Snyder Fox
相关产品推荐
相关产品推荐

