查看原文
其他

PDF表格信息提取

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:王碧琪
文字编辑:钱梦璇
技术总编:张    邯



Stata暑期线上课程火热招生中~

爬虫俱乐部将于2020年7月11日至14日线上举行为期四天的Stata编程技术定制培训。课程通过案例教学模式,旨在帮助大家在短期内掌握Stata的基本命令、编程、数据处理以及结果输出等技术,并针对最新版Stata中的实用新功能做出详细介绍,包括框架功能(frame:读入多个数据集)等等。同时,此次云端课程提供录播,提供线上答疑。详细培训大纲及报名方式请查看《Stata云端课程来啦》,或点击文末阅读原文直接提交报名信息呦~

《提取PDF文本信息:入门》中,我们介绍了使用pdfminer提取PDF中的信息,其中提取的是文本内容,而对于表格内容,使用pdfminer会输出无格式的文本,不能保留表格格式,而pdfplumber就能很好的解决问题。本文将比较两个方法的差异。
待处理的PDF文档中的表格如下:

一、pdfminer

我们用以下程序使用pdfminer进行提取(具体原理已在《提取PDF文本信息:入门》文章中详述):

from pdfminer.pdfparser import PDFParser, PDFDocumentfrom pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreterfrom pdfminer.converter import PDFPageAggregatorfrom pdfminer.layout import *
parser = PDFParser(open(r"d: \table.pdf"))doc = PDFDocument()parser.set_document(doc)doc.set_parser(parser)rsrcmgr = PDFResourceManager() #创建PDF资源管理器来管理共享资源laparams = LAParams() #创建一个PDF设备对象device = PDFPageAggregator(rsrcmgr, laparams=laparams)interpreter = PDFPageInterpreter(rsrcmgr, device) #创建一个PDF解释器对象
with open(r"d:\table.txt", 'w') as f: for page in doc.get_pages(): #循环遍历列表,每次处理一个page的内容 interpreter.process_page(page) layout = device.get_result() for x in layout: if isinstance(x, LTTextBox): print(x.get_text().strip()) f.write(x.get_text().strip()+"\n")

结果为:

2010ThingsQuantityApplesOrangesPears10208

由于只能提取文字,这样的结果已经破坏了最初的表格样式。

二、pdfplumber

首先导入库,生成pdfplumber对象:

import pdfplumberpdf = pdfplumber.open(r"d: \table.pdf")print(pdf)

结果如下:

<pdfplumber.pdf.PDF object at 0x000001A536631DC8>

结果表明生成了一个pdfplumber对象,我们可以调用.pages()方法解析得到每一页的内容:

pages=pdf.pagesprint(pages)

结果如下:

[<pdfplumber.page.Page object at 0x000001A534FD8348>]

生成的可迭代对象可以通过for遍历:

for p in pages: table1=p.extract_table() print(table1)

结果如下:

[['2010', None], ['Things', 'Quantity'], ['Apples', '10'], ['Oranges', '20'], ['Pears', '8']]

table1是一个列表,到这里我们就得到了文档中的表格内容了。列表table1中有若干个小列表,分别表示表格内容中的每一行,每个小列表中有两个元素,虽然原表格内容的第一行只有一个元素,但是这里的结果是补齐成两个元素。我们逐行打印出来。

for unitrow in table1: print(unitrow)

结果如下:

['2010', None]['Things', 'Quantity']['Apples', '10']['Oranges', '20']['Pears', '8']

另外,这里为了更清晰明了地展示列表内容,可以引入pandas库。

import pandas as pd
df=pd.DataFrame(table1[1:],columns=table1[0])print(df)

结果如下:

这样,就得到了比较规整的保留原格式的PDF表格内容了。PDF文档的内容提取比较费工夫,这里提供的表格内容提取方式相对比较成熟。接下来,小编将继续探索PDF文档的内容提取方式,敬请关注~







对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐

神经网络——brain

marktouse标记使用变量
换种视角看问题——支持向量机(SVM)
提取PDF文本信息:入门
毕业季|b站《入海》评论爬取
Stata云端课程来啦
利用广义线性模型实现的分类——Logistic回归
Requests get爬虫之设置headers
数据分析薪资待遇如何?——跟我来,带你看
Vardistinct一键去重计数
从statsmodels到线性回归
Pandas的GroupBy机制
首行数据如何快速转变量名?
文件太多乱乱的?合并一下吧!
线性回归的正则化 ——岭回归与LASSO回归
Pandas中节约空间的小tip—categorical类型
Ftools命令组之flevelsof命令介绍
疫情下的家庭关系|《请回答1988》影评爬取

关于我们



微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

此外,欢迎大家踊跃投稿,介绍一些关于stata和python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存