网页表格抓取(如何才能高效提取出pdf文件中的表格数据呢?)

优采云 发布时间: 2021-10-16 11:30

  网页表格抓取(如何才能高效提取出pdf文件中的表格数据呢?)

  在实际研究中,我们往往需要获取大量的数据,而这些数据很大一部分是以pdf形式呈现的,比如公司年报、发行上市公告等。 面对如此多的数据表格,显然不建议手动复制和粘贴它们。那么如何才能高效的提取pdf文件中的表格数据呢?

  

  Python提供了很多可用于pdf表格识别的库,如camelot、tabula、pdfplumber等,总体来说pdfplumber库的性能更好,可以提取完整且相对规范的表格。所以,这条推文也主要介绍了pdfplumber库在pdf表提取中的作用。

  pdfplumber库作为强大的pdf文件解析工具,可以快速将pdf文档转换为易于处理的txt文档,并输出pdf文档的字符、页码、页码等信息,还可以进行页面可视化操作。在使用pdfplumber库之前,需要先安装,即在cmd命令行中输入:

  pip 安装 pdfplumber

  pdfplumber库提供了两个pdf表提取函数,分别是.extract_tables()和.extract_table(),这两个函数的提取结果是不同的。为了演示,我们在网站上下载了一份pdf格式的短期融资券主体信用评级报告。任意选择一张表,其界面如下:

  

  Python骚操作,提取pdf文件中的表数据!

  

  关于如何快速学习python,可以加小编的python学习群:611+530+101,不管你是新手还是大牛,欢迎小编不定期分享干货。

  每天晚上20:00会有直播分享python学习知识和路线方法。群里会不定期更新最新的教程和学习方法。大家都在学习python,或者转行,或者大学生,打工,如果想提升自己的能力,如果你是正在学习python的小伙伴,都可以加入学习。最后,祝所有程序员都能走上人生的巅峰,让代码将梦想照进现实

  接下来,我们简单分析一下两种提取模式的结果差异。

  (1).extract_tables()

  它可以输出页面中的所有表,并返回一个嵌套列表,其结构级别为表→行→单元格。这时,页面上的整个表被放入一个大列表中,原表中的每一行构成了大列表中的每个子列表。如果您需要输出单个外部列表元素,您得到的是由原创表中的同一行元素组成的列表。例如,我们执行以下过程:

  

  Python骚操作,提取pdf文件中的表数据!

  输出结果:

  

  Python骚操作,提取pdf文件中的表数据!

  (2).extract_table()

  返回多个独立列表,其结构级别为row→cell。如果页面中有多个行数相同的表,默认会输出最上面的表;否则只输出行数最多的表。此时,表格的每一行都作为一个单独的列表,列表中的每个元素都是原创表格每个单元格的内容。如果你需要输出一个元素,你会得到一个特定的值或字符串。如下:

  

  Python骚操作,提取pdf文件中的表数据!

  输出结果:

  

  Python骚操作,提取pdf文件中的表数据!

  在此基础上,我们详细介绍了如何从pdf文件中提取表格数据。一种思路是把提取的列表当成字符串,结合Python的正则表达式re模块进行处理,保存为Excel可以识别的标准逗号分隔的csv文件。即,按以下步骤进行:

  

  Python骚操作,提取pdf文件中的表数据!

  输出结果:

  

  Python骚操作,提取pdf文件中的表数据!

  

  虽然可以获得完整的表格数据,但是这种方法比较难理解,在处理结构不规则的表格时容易出错。因为pdfplumber库提取的表格数据是整洁的列表结构,收录数字、字符串等数据类型。因此,我们可以调用pandas库下的DataFrame()函数,将列表转换为可以直接输出到Excel的DataFrame数据结构。DataFrame的基本构造函数如下:

  数据帧([数据,索引,列])

  三个参数data、index、columns分别代表创建对象、行索引、列索引。DataFrame类型可以通过二维的ndarray对象、列表、字典、元组等来创建,本推文中的数据是指整个pdf表格,提取过程如下:

  

  Python骚操作,提取pdf文件中的表数据!

  其中table[1:]表示选择整个表进行DataFrame对象创建,columns=table[0]表示使用表的第一行元素作为列变量名,不创建行索引. 输出Excel表格如下:

  

  Python骚操作,提取pdf文件中的表数据!

  通过上面的简单程序,我们已经提取了完整的pdf表格。但是需要注意的是,面对不规则的表数据提取,DataFrame对象的创建方法可能还是错误的,需要在实际操作中进行检查。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线