使用pdfquery与Pandas实现多页PDF抓取时遇ValueError问题求助
问题分析与修复方案
代码核心问题
pdfscrape函数无返回值:这个函数只完成了数据提取,但没有返回生成的DataFrame,导致循环里page = pdfscrape(pdf)得到的是None,这就是报错"All objects passed were None"的直接原因。- DataFrame合并语法错误:循环里
master = master(pd.concat(...))是把DataFrame对象当成函数调用,完全不符合Pandas语法,正确做法是用pd.concat合并新旧DataFrame。 - 页面加载逻辑冲突:初始的
pdf.load()会加载所有页面,后续循环里再加载单页容易导致数据混乱,应该针对单页单独加载。 - CSV重复写入:把
to_csv放在循环里会每次覆盖文件,应该等所有页面数据合并完成后再导出。
修正后的完整代码
import pdfquery import pandas as pd def pdfscrape(pdf): # 提取指定坐标的文本内容 num_1 = pdf.pq('LTTextBoxHorizontal:overlaps_bbox("378.0, 759.06, 456.0, 769.06")').text() num_2 = pdf.pq('LTTextBoxHorizontal:overlaps_bbox("30.0, 431.06, 360.0, 441.06")').text() # 返回单页数据的DataFrame return pd.DataFrame({'num1': [num_1], 'num2': [num_2]}) # 初始化PDFQuery对象 pdf = pdfquery.PDFQuery(r'path') # 获取PDF总页数 pagecount = pdf.doc.catalog['Pages'].resolve()['Count'] # 初始化空的主DataFrame,用于存储所有页面数据 master = pd.DataFrame() for p in range(pagecount): # 加载当前待处理的单页 pdf.load(pages=[p]) # 调用函数获取单页数据 page = pdfscrape(pdf) # 将单页数据合并到主DataFrame master = pd.concat([master, page], ignore_index=True) # 所有页面处理完成后,导出为CSV文件 master.to_csv("output.csv", index=False) print(master)
关键修改说明
- 给
pdfscrape函数添加return语句,返回单页数据的DataFrame,确保page变量始终有有效数据。 - 调整合并逻辑为
pd.concat([master, page], ignore_index=True),正确实现多页数据的累加合并。 - 改用
pdf.load(pages=[p])加载单页,避免全量加载导致的冲突。 - 将
to_csv移到循环外,确保只导出一次完整的合并数据,避免重复覆盖。
内容的提问来源于stack exchange,提问作者Andrew Martin
相关产品推荐
相关产品推荐

