查看原文
其他

Camelot提取PDF表格:一页多表、多页一表

爬虫俱乐部 Stata and Python数据分析 2023-10-24

本文作者:冀思慧,中南财经政法大学金融学院

本文编辑:周一鸣

技术总编:王玉婷

Stata and Python 数据分析

爬虫俱乐部Stata基础课程Stata进阶课程Python课程可在小鹅通平台查看,欢迎大家多多支持订阅!如需了解详情,可以通过课程链接(https://appbqiqpzi66527.h5.xiaoeknow.com/homepage/10)或课程二维码进行访问哦~

在推文《Camelot:从PDF中提取表格数据》中,我们已经学习了使用camlot来提取PDF表格数据的安装和基础操作。然而在实际的数据预处理过程中,我们会面临一页多表、多页一表以及非空白背景色等复杂情况,我们可以根据本文来处理这些情况。

01数据生成
我们使用Stata系统数据来生成我们需要的PDF表格,有需要的读者可以使用以下代码生成所需文件,也可在后台回复“表格数据”获取
clear allcd G:\****************第1页:一页一表sysuse auto,clearputpdf begin putpdf paragraph,halign(center) //段落居中对齐putpdf text ("表 1: 前10行样本"),boldputpdf table tbl1 = data("make price mpg") in 1/10,varnames****************第2页:一页两表putpdf pagebreak //进行换页putpdf table tbl2 = data("make price mpg") in 20/30,varnamesputpdf paragraph,halign(center) putpdf text ("表 3: 10-20行样本"),boldputpdf table tbl3 = data("make price mpg") in 10/20,varnames****************第3-4页:两页一表putpdf pagebreak putpdf paragraph,halign(center) putpdf text ("表 4: 所有样本"),boldputpdf table tbl4 = data("make price mpg"),varnames****************第5页:带背景色的表格putpdf paragraph,halign(center) putpdf text ("表 5: 11-20行样本"),boldputpdf table tbl5 = data("make price mpg") in 11/20,varnames width(5) halign(center) border(all,,blue) //设置表格的宽度为5英寸,所有的边框线为蓝色forv row =2(2)11{ forv col=1/3{ putpdf table tbl5(`row',`col'),bgcolor(lightblue) //使指定单元格底色为浅蓝色 }}forv col=1/3{ putpdf table tbl5(1,`col'),bold bgcolor(blue) //使指定单元格底色为蓝色,并且字体色为白色}cap putpdf save G:\表格数据.pdf,replace
02表格识别与提取
(1)
表格识别之“一页一表”

下图展示了PDF文件的第一页,仅含一个表格。‍

对此,我们可以通过以下代码识别该表格并进行提取:

##解析第1页表格import camelottables = camelot.read_pdf('G:/表格数据.pdf',pages='1' ) tables ##查看获得几个表格tables[0] ##查看表的形状print(tables[0].parsing_report) #打印解析报告df__1 = tables[0].df #打印出提取表格中的内容
(2)
表格识别之“一页两表”

下图为PDF文件的第二页,包含的两个表格,其中第一个表格不含表头。

我们可以使用下列代码对该页面的表格进行识别:

##解析第2页表格import camelotimport pandas as pdtables = camelot.read_pdf('G:/表格数据.pdf',pages='2' )tables

打印结果如下图所示,显示识别到两个表格。  

分别对两个表格进行列命名和索引指定等操作,最后将两个表格进行合并,执行代码如下:

df1 = tables[0].dfdf2 = df1.rename(columns=df1.iloc[0]).drop(df1.index[0]) ##将第0行作为行索引df3 = tables[1].dfdf4 = df3.rename(columns=df3.iloc[0]).drop(df3.index[0]) df__2= df2.append(df4,ignore_index=True) ##将两个数据进行合并,ignore_index=True,表根据列名对齐合并,生成新的indexprint(df__2)
(3)‍
表格识别之“多页一表”

对于长形表,即表格记录较多,占据页面超过一页的表格,我们采用:分别识别多个页面的表格,处理后再进行合并的方法。

注意,非首页表格未包含变量名,针对此种情况,我们使用以下代码进行处理:
##解析第3-4页数据import camelotimport pandas as pdtables = camelot.read_pdf('G:/表格数据.pdf',pages='3-4' )tables df5 = tables[0].dfdf6 = tables[1].dfdf7= df5.append(df6,ignore_index=True)df__3 = df7.rename(columns=df7.iloc[0]).drop(df7.index[0]) print(df__3)

执行以上代码将会得到以下结果:

(4)‍
表格识别之“非空背景色”

下图为具有颜色填充的表格。非空白的背景色虽然易于人眼对比和观看,但其也为PDF表格数据提取增加了很多噪音。

首先,我们将具有背景色的表格做常规提取,程序如下:

##解析第5页表格import camelottables = camelot.read_pdf('G:/表格数据.pdf',pages='5' ) tables[0].df

执行上述程序,我们发现提取出来的表格格式不太规范,我们可以根据需要调整参数。

经过以下参数调整,就能够提取出较为规范的表格。

# 表格格式错误,添加flavor='stream'tables = camelot.read_pdf('G:/表格数据.pdf',flavor='stream',pages='5' )
# 如果表格过于长,但是camelot提取没有到表格的最下面 添加edge_tol=500tables = camelot.read_pdf('G:/表格数据.pdf',flavor='stream',edge_tol=500,pages='5')
# 如果表格行与行之间分割不明显,或者发生重叠的问题,添加row_tol=10tables = camelot.read_pdf('G:/表格数据.pdf',flavor='stream',edge_tol=500,row_tol=10,pages='5')

03数据导出

我们将PDF文件的表格识别为DataFrame之后,可以使用to_csv()、to_json()、to_excel()等函数进行导出。以.xlsx文件格式为例,以下分别对单表和多表进行导出。

(1)‍‍‍
单表导出

单表导出,即将一个DataFrame导出至新建Excel文件中,程序如下:

df1.to_excel('G:\auto数据.xls',sheet_name="demo") ##括号内为路径及文件名称
(2)‍‍‍
多表导出

多表导出,即将多个DataFrame分为不同sheet导入同一个Excel文件中:

with pd.ExcelWriter('G:\auto数据.xls') as writer: df__1.to_excel(writer, 'df1') df__2.to_excel(writer, 'df2') df__3.to_excel(writer, 'df3')

以上就是我们今天的全部内容啦,大家快去操作一下吧~

END

重磅福利!为了更好地服务各位同学的研究,爬虫俱乐部将在小鹅通平台上持续提供金融研究所需要的各类指标,包括上市公司十大股东、股价崩盘、投资效率、融资约束、企业避税、分析师跟踪、净资产收益率、资产回报率、国际四大审计、托宾Q值、第一大股东持股比例、账面市值比、沪深A股上市公司研究常用控制变量等一系列深加工数据,基于各交易所信息披露的数据利用Stata在实现数据实时更新的同时还将不断上线更多的数据指标。我们以最前沿的数据处理技术、最好的服务质量、最大的诚意望能助力大家的研究工作!相关数据链接,请大家访问:(https://appbqiqpzi66527.h5.xiaoeknow.com/homepage/10)或扫描二维码:

最后,我们为大家揭秘雪球网(https://xueqiu.com/)最新所展示的沪深证券和港股关注人数增长Top10。



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




往期推文推荐 

Stata绘图系列——条形图绘制

Python常见内置函数(一)Stata绘图系列——饼形图绘制【爬虫实战】深交所服务业年报数据

“挂羊头卖狗肉”?

Python与excel交互--xlsxwriter模块

cnmapsearch——离公司最近的快餐店在哪

Python中的异常处理 Python交互式数据可视化——酷炫的Altair库 hk系列命令(3)—— hktrade hk系列命令(2)—— hkar hk系列命令(1)—— hkstock 超好用的字符串方法 基于Python的假设检验实现Stata与MySQL交互--基础操作 Jupyter Notebook中的魔术命令《Stata正则表达式》由中国金融出版社出版发行   匿名函数lambda到底怎么用?
     关于我们 

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

   武汉字符串数据科技有限公司一直为广大用户提供数据采集和分析的服务工作,如果您有这方面的需求,请发邮件到statatraining@163.com,或者直接联系我们的数据中台总工程司海涛先生,电话:18203668525,wechat: super4ht。海涛先生曾长期在香港大学从事研究工作,现为知名985大学的博士生,爬虫俱乐部网络爬虫技术和正则表达式的课程负责人。



此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。

投稿邮箱:statatraining@163.com投稿要求:1)必须原创,禁止抄袭;2)必须准确,详细,有例子,有截图;注意事项:1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。

2)邮件请注明投稿,邮件名称为“投稿+推文名称”。3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

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

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