• 技术文章 >后端开发 >Python教程

    Python如何实现从PDF文件中爬取表格数据(代码示例)

    不言不言2018-10-24 17:15:18转载10534
    本篇文章给大家带来的内容是关于Python如何实现从PDF文件中爬取表格数据(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

      本文将展示一个稍微不一样点的爬虫。
      以往我们的爬虫都是从网络上爬取数据,因为网页一般用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,整个文件只有一页,这一页中只有一个表格,如下:

    9419034-4473cf94547e62f4.png

    使用以下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)

    输出结果为:

    <TableList n=1>
    <Table shape=(4, 4)>
    [['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文件如下:

    9419034-83b38d810067c212.png

    例2

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

    9419034-6549895a9ac04777.png

    为了提取整个页面中唯一的表格,我们需要定位表格所在的位置。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页面当作表格,因此就没有找到表格。但是绘制的页面坐标的图像如下:

    9419034-b1a869f1bc21253a.png

    仔细对比之前的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))

    输出的结果为:

    <class 'pandas.core.frame.DataFrame'>
             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如何实现从PDF文件中爬取表格数据(代码示例)的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:segmentfault思否,如有侵犯,请联系admin@php.cn删除
    专题推荐:python
    上一篇:Python中matplotlib库的用法介绍 下一篇:通过Python函数来详细解析区块链
    20期PHP线上班

    相关文章推荐

    • 【活动】充值PHP中文网VIP即送云服务器• 【Python】Windows平台下Python、Pydev连接Mysql数据库_MySQL• 使用Python的Django框架中的压缩组件Django Compressor_MySQL• 使用Python创建MySQL数据库实现字段动态增加以及动态的插入数据_MySQL• 在python中使用mysql_MySQL• python mysqldb_MySQL• python连接MySQL connect函数的参数说明_MySQL
    1/1

    PHP中文网