查看原文
其他

PDF文本信息提取(二)

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

本文作者:王碧琪文字编辑:方    言技术总编:张    邯



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


爬虫俱乐部将于2020年7月11日至14日线上举行为期四天的Stata编程技术定制培训。课程通过案例教学模式,旨在帮助大家在短期内掌握Stata的基本命令、编程、数据处理以及结果输出等技术,并针对最新版Stata中的实用新功能做出详细介绍,包括框架功能(frame:读入多个数据集)等等。同时,此次云端课程提供录播,提供线上答疑。详细培训大纲及报名方式请查看《Stata云端课程来啦》,或点击文末阅读原文直接提交报名信息呦~另外,应广大学员需求,爬虫俱乐部将于2020年7月25日至28日线上举行Python编程技术训练营,帮助大家在掌握Python基本思想的基础上,学习科学计算技术与网络数据抓取技术,详情可点击《Python云端培训课程开始报名~》Stata和Python一起报名有超值优惠,详情咨询联系人。



在之前的推文提取PDF文本信息:入门中,我们使用pdfminer提取了PDF文档中的文本信息,相较之下,今天要介绍的pdfplumber提取文本信息所使用的程序更加简洁,处理方式更直接,一起来学习一下吧~

一、简介


待处理的PDF文档内容如下图示:

pdfplumber中的extract_text()函数就可以实现提取文本信息的功能。官方文档如下:

.extract_text(x_tolerance=0, y_tolerance=0) Collates all of the page's character objects into a single string. Adds spaces where the difference between the x1 of one character and the x0 of the next is greater than xtolerance. Adds newline characters where the difference between the doctop of one character and the doctop of the next is greater than ytolerance.

另外,extract_words()函数也可以实现提取文本信息的功能,二者有些不同,官方描述如下:

.extract_words(x_tolerance=0, y_tolerance=0) Returns a list of all word-looking things and their bounding boxes. Words are considered to be sequences of characters where the difference between the x1 of one character and the x0 of the next is less than or equal to xtolerance and where the doctop of one character and the doctop of the next is less than or equal to ytolerance.

二者皆是返回文本内容,但是具体的返回信息有所不同,下面用一个实际的例子具体讲解。


二、案例应用

(一)首先引入该库,并且导入待处理的PDF文档,生成pages对象

import pdfplumber
pdf=pdfplumber.open(r"E: \01.pdf")pages=pdf.pages
也可以使用with open语句,效果相同:
import pdfplumberwith pdfplumber.open(r"E: \01.pdf") as pdf: pages=pdf.pages

(二)对PDF的每一页进行处理

pages是一个可迭代对象,我们需要逐页处理:
for p in pages: print(p) print(p.page_number) print(p.width) print(p.height) print(p.objects) #lines chars rects
部分结果如下图:


p是一个pdfplumber处理后得到的每一页文档的对象,它有一些属性,如page_number返回页码,width返回宽度,height返回高度,objects返回p中识别到的所有对象,包括lines、chars、rects等。extract_text()函数就是提取了这些 objects中的 text。

for p in pages: text=p.extract_text() print(text) print(type(text))

结果是:

可以看到,PDF文档中的文本内容按照原文中的换行格式(并非实际的段落)呈现出来,得到的对象类型是字符串。
另外还可以使用 extract_words()函数。
for p in pages: word=p.extract_words() print(word) print(len(word)) print(type(word))

结果如下:


结果显示,word是一个列表,列表中包含8个字典元素。每一个字典元素对应了一行文字,列示了x0、x1、top、bottom来表示对象所处的位置信息,text对应的value是文字本身。因此,为了得到所有的text,需要进行一下遍历,提取text的内容:
for p in pages: word=p.extract_words() for unitword in word: print(unitword['text'])

结果是:


这里生成的也是字符串对象,得到的结果与上面使用extract_text()无异。最后把生成的结果导出即可。

三、完整程序

import pdfplumberwith pdfplumber.open(r"E:\01.pdf") as pdf: pages=pdf.pages   for p in pages:   print(p) print(p.page_number) print(p.width) print(p.height) print(p.objects) #lines chars rects
text=p.extract_text() print(text) print(type(text))
word=p.extract_words() print(word) print(len(word)) print(type(word))
for unitword in word: print(unitword['text'])

如果只需要快速提取所有的文本信息,那么.extract_text()无疑是好的选择,而.extract_words()在提取信息时会给出位置信息,这在批量处理pdf文件清洗数据的时候可以作为清洗条件或筛选范围,二者各有好处,有需要的小伙伴们可以自己尝试一下~






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

取长补短、互通有无 ——集成学习介绍之Bagging &随机森林

PDF表格信息提取
神经网络——brain
marktouse标记使用变量
换种视角看问题——支持向量机(SVM)
提取PDF文本信息:入门
毕业季|b站《入海》评论爬取
Stata云端课程来啦
利用广义线性模型实现的分类——Logistic回归
Requests get爬虫之设置headers
数据分析薪资待遇如何?——跟我来,带你看
Vardistinct一键去重计数
从statsmodels到线性回归
Pandas的GroupBy机制
首行数据如何快速转变量名?
文件太多乱乱的?合并一下吧!

关于我们



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

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


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

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