资讯专栏INFORMATION COLUMN

另类爬虫:从PDF文件中爬取表格数据

Anchorer / 3549人阅读

摘要:本文将展示如何利用的模块从文件中爬取表格数据。但如何从文件中提取其中的表格,这却是一个大难题。我们以输出文件为例从文件中提取表格将表格数据转化为文件得到的文件如下例在例中,我们将提取页面中的某一区域的表格的数据。

简介

  本文将展示一个稍微不一样点的爬虫。
  以往我们的爬虫都是从网络上爬取数据,因为网页一般用HTML,CSS,JavaScript代码写成,因此,有大量成熟的技术来爬取网页中的各种数据。这次,我们需要爬取的文档为PDF文件。本文将展示如何利用Python的camelot模块从PDF文件中爬取表格数据。
  在我们的日常生活和工作中,PDF文件无疑是最常用的文件格式之一,小到教材、课件,大到合同、规划书,我们都能见到这种文件格式。但如何从PDF文件中提取其中的表格,这却是一个大难题。因为PDF中没有一个内部的表示方式来表示一个表格。这使得表格数据很难被抽取出来做分析。那么,我们如何做到从PDF中爬取表格数据呢?
  答案是Python的camelot模块!
  camelot是Python的一个模块,它能够让任何人轻松地从PDF文件中提取表格数据。可以使用以下命令安装camelot模块(安装时间较长):

pip install camelot-py

camelot模块的官方文档地址为:https://camelot-py.readthedoc...。
  下面将展示如何利用camelot模块从PDF文件中爬取表格数据。

例1

  首先,让我们看一个简单的例子:eg.pdf,整个文件只有一页,这一页中只有一个表格,如下:

使用以下Python代码就可以提取该PDF文件中的表格:

import camelot

# 从PDF文件中提取表格
tables = camelot.read_pdf("E://eg.pdf", pages="1", flavor="stream")

# 表格信息
print(tables)
print(tables[0])
# 表格数据
print(tables[0].data)

输出结果为:



[["ID", "姓名", "城市", "性别"], ["1", "Alex", "Shanghai", "M"], ["2", "Bob", "Beijing", "F"], ["3", "Cook", "New York", "M"]]

分析代码,camelot.read_pdf()为camelot的从表格中提取数据的函数,输入的参数为PDF文件的路径,页码(pages)和表格解析方法(有stream和lattice两个方法)。对于表格解析方法,默认的方法为lattice,而stream方法默认会把整个PDF页面当做一个表格来解析,如果需要指定解析页面中的区域,可以使用table_area这个参数。
  camelot模块的便捷之处还在于它提供了将提取后的表格数据直接转化为pandas,csv,JSON,html的函数,如tables[0].df,tables[0].to_csv()函数等。我们以输出csv文件为例:

import camelot

# 从PDF文件中提取表格
tables = camelot.read_pdf("E://eg.pdf", pages="1", flavor="stream")

# 将表格数据转化为csv文件
tables[0].to_csv("E://eg.csv")

得到的csv文件如下:

例2

  在例2中,我们将提取PDF页面中的某一区域的表格的数据。PDF文件的页面(部分)如下:

为了提取整个页面中唯一的表格,我们需要定位表格所在的位置。PDF文件的坐标系统与图片不一样,它以左下角的顶点为原点,向右为x轴,向上为y轴,可以通过以下Python代码输出整个页面的文字的坐标情况:

import camelot

# 从PDF中提取表格
tables = camelot.read_pdf("G://Statistics-Fundamentals-Succinctly.pdf", pages="53", 
                          flavor="stream")

# 绘制PDF文档的坐标,定位表格所在的位置
tables[0].plot("text")

输出结果为:

UserWarning: No tables found on page-53 [stream.py:292]

整个代码没有找到表格,这是因为stream方法默认将整个PDF页面当作表格,因此就没有找到表格。但是绘制的页面坐标的图像如下:

仔细对比之前的PDF页面,我们不难发现,表格对应的区域的左上角坐标为(50,620),右下角的坐标为(500,540)。我们在read_pdf()函数中加入table_area参数,完整的Python代码如下:

import camelot

# 识别指定区域中的表格数据
tables = camelot.read_pdf("G://Statistics-Fundamentals-Succinctly.pdf", pages="53", 
                          flavor="stream", table_area=["50,620,500,540"])

# 绘制PDF文档的坐标,定位表格所在的位置
table_df = tables[0].df

print(type(table_df))
print(table_df.head(n=6))

输出的结果为:


         0               1                2           3
0  Student  Pre-test score  Post-test score  Difference
1        1              70               73           3
2        2              64               65           1
3        3              69               63          -6
4        …               …                …           …
5       34              82               88           6
总结

  在具体识别PDF页面中的表格时,除了指定区域这个参数,还有上下标、单元格合并等参数,详细地使用方法可参考camelot官方文档网址:https://camelot-py.readthedoc...。

注意:本人现已开通微信公众号: Python爬虫与算法(微信号为:easy_web_scrape), 欢迎大家关注哦~~

参考文献

camelot模块的官方文档:https://camelot-py.readthedoc...

Camelot:一个从pdf抽取表格数据的Python库:https://blog.csdn.net/qq_4092...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/44853.html

相关文章

  • 爬虫 - 收藏集 - 掘金

    摘要:在这之前,还是有必要对一些概念超轻量级反爬虫方案后端掘金前言爬虫和反爬虫日益成为每家公司的标配系统。 爬虫修炼之道——从网页中提取结构化数据并保存(以爬取糗百文本板块所有糗事为例) - 后端 - 掘金欢迎大家关注我的专题:爬虫修炼之道 上篇 爬虫修炼之道——编写一个爬取多页面的网络爬虫主要讲解了如何使用python编写一个可以下载多页面的爬虫,如何将相对URL转为绝对URL,如何限速,...

    1fe1se 评论0 收藏0
  • 记一次还可以抢救一下的爬虫私活,求接盘!

    摘要:前言最近接了一个爬虫的私活,收益颇丰。项目需求一个类似百度文库的网站,要求给出获得文章,以形式保存下来。但是这次需要保存到这不难,难在要求格式不变。文章都是以许多标签组合在一起的。知情人请告知,感激不尽。 前言 最近接了一个爬虫的私活,收益颇丰。自认为对爬虫掌握的还算不错,爬过很多国内外网站,数据超过百万,应对过封IP、设验证码、假数据、强制登录等反爬虫手段。于是乎,我毫不犹豫的接下了...

    alanoddsoff 评论0 收藏0
  • 使用Node.js爬取任意网页资源并输出高质量PDF文件到本地~

    摘要:上面只爬取了京东首页的图片内容,假设我的需求进一步扩大,需要爬取京东首页中的所有标签对应的跳转网页中的所有的文字内容,最后放到一个数组中。 showImg(https://segmentfault.com/img/bVbtVeV?w=3840&h=2160); 本文适合无论是否有爬虫以及Node.js基础的朋友观看~ 需求: 使用Node.js爬取网页资源,开箱即用的配置 将爬取到的...

    seasonley 评论0 收藏0
  • 使用Node.js爬取任意网页资源并输出高质量PDF文件到本地~

    摘要:上面只爬取了京东首页的图片内容,假设我的需求进一步扩大,需要爬取京东首页中的所有标签对应的跳转网页中的所有的文字内容,最后放到一个数组中。 showImg(https://segmentfault.com/img/bVbtVeV?w=3840&h=2160); 本文适合无论是否有爬虫以及Node.js基础的朋友观看~ 需求: 使用Node.js爬取网页资源,开箱即用的配置 将爬取到的...

    xiaoxiaozi 评论0 收藏0

发表评论

0条评论

Anchorer

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<