很多小伙伴在撰写论文时,经常会碰到一些需要引用表格的地方。无奈很多论文素材都是pdf格式的。很难将表格内容复制出来。
今天,带大家一起来了解一款将表格内容从pdf文件中提取出来的利器—tabula-py这个模块。
下面,详细了解下。
tabula
Tabula是专门用来提取PDF表格数据的。它能够将表格从PDF提取到DataFrame或Json中。 它还可以从PDF中提取表格并将文件保存为CSV、TSV 或 JSON等格式。
【环境需求】
Java 8+ Python 3.7+【安装方法】
pip install tabula-py
模块安装成功还要判断环境是否支持
import tabula
tabula.environment_info()
java环境不符合要求Java环境配置参考百度(搜索下,有很多介绍),安装Java8以上版本,配置成功后,如下图所示:
环境配置成功显示上面界面,说明我们的环境和模块都安装成功了。
用tabula提取pdf中表格
模块提供的接口如下:
【read_pdf()方法将pdf文件中表格读取为DateFrame对象列表(可输出)】
import tabula
dfs = tabula.read_pdf(*args)
通常传入一个input_path参数即可,其余参数对输出格式、范围、编码等进行设定,当默认参数不能识别表格时,就需要我们自定义表格区域,area、relative_area提供了两种有效的设定范围的方法。
方法中参数解释如下:
input_path:可以传入文件位置或者目标PDF文件的类文件对象。它也可以是url,由tabla.py自动下载(此时,一般设置stream=True)。output_format: 返回对象的输出格式(dataframe或json),给出此选项将强制忽略“multiple_tables”选项。encoding: DateFrame的编码类型。默认值:utf-8java_options: 设置java相关属性pandas_options: 设置pandas相关属性。multiple_tables=True时,pandas_options传递给pandas.DataFrame,否则传递给pandas.read_csv。multiple_tables: 它允许在一个页面中处理多个表。默认值:True。如果启用了multiple_tables选项,模块将使用pd.read_csv()或pd.DataFrame()。确保传递适当的“pandas_options”。user_agent: 从url下载pdf时设置自定义用户代理。否则,它使用默认的urllib请求用户代理。use_raw_url: 默认为False,它强制url使用“input_path”字符串,而不使用引号/反引号。pages: 传入一个页面索引(这里将索引转化为字符串格式)指定要从中提取的页面,或者使用“all”获取所有页面的表格内容,它允许str,int,list:int。默认值:1(提取第一页表格内容)。例如:'1-2,3', 'all', [1,2]guess: 猜测每页要分析的页面部分。默认值为True。如果使用“area”选项,该选项将变为False。从模块的1.0.3版本开始,guess选项独立于lattice和stream选项,您可以同时使用guess和lattice/stream选项。area: 要分析的页面部分(上、左、下、右)。默认值为整个页面。如果要使用多个区域选项并在一个表中提取,设置multiple_tables=False[269.875,12.75,790.5,561] 页面的区域
[[12.1,20.5,30.1,50.2], [1.0,3.2,10.5,40.2]] 页面区域列表
relative_area:如果所有区域值都在0-100(包括0-100)之间,且前面有“%”,则输入将被视为页面实际高度或宽度的%。默认值为“False”。lattice: 强制使用lattice-mode提取提取PDF(如果存在分隔每个单元格的划线,如Excel电子表格的PDF),默认False。stream:强制使用stream-mode提取提取PDF(如果没有分隔每个单元格的规则线,如Excel电子表格的PDF),默认False。password: 解密文档的密码。默认值:空。silent: 抑制所有stderr输出。columns: 列边界的X坐标。[10.1, 20.2, 30.3]format: 输出文件或提取对象的格式。可选"CSV", "TSV", "JSON"batch: 转换提供目录中的所有PDF文件,此参数应为目录路径。output_path:输出文件路径,输出的文件格式取决于format参数。options: tabla java的原始选项字符串。该函数返回一个DataFrames列表。
【convert_into()方法将pdf文件中表格转化为CSV格式输出】
import tabula
dfs = tabula.convert_into(*args)
方法中参数解释如下(这些参数跟上面参数相同,下面对参数类型进行解释,上下相同,对照理解):
input_path: FileLikeObjoutput_path: stroutput_format: str = "csv"java_options: Optional[List[str]] = Nonepages: Optional[Union[str, int, List[int]]] = Noneguess: bool = Truearea: Optional[Union[Iterable[float], Iterable[Iterable[float]]]] = Nonerelative_area: bool = Falselattice: bool = Falsestream: bool = Falsepassword: Optional[str] = Nonesilent: Optional[bool] = Nonecolumns: Optional[List[float]] = Noneformat: Optional[str] = Nonebatch: Optional[str] = Noneoptions: str = ""该函数实现了将PDF中表格转换为CSV文件输出的功能。
【convert_into_by_batch()方法转换一个目录中PDF文件中的表格(可输出)】
转换目录中的所有PDF文件表格并输出。
import tabula
dfs = tabula.convert_into_by_batch(*args)
这个方法提供了如下参数设置。
input_dir、output_format、java_options、pages、guess、area、relative_area、lattice、password、silent、columns、format、output_path、options
参数信息比对上文。通常情况下,不用记忆,使用时对照本文内容设置即可。小伙伴可收藏备用哦。
举个例子
我们之前介绍过一个关于人口的爬虫,我们将爬取到的电子表格另存为PDF格式,然后命名为“test.pdf”,从这个pdf中提取需要的表格内容。
导入模块
import tabula读取pdf文件中的表格内容
dfs = tabula.read_pdf('test.pdf', pages='all')我们来看下这个dfs是什么东东
print(type(dfs))输出为:
<class 'list'>
看下列表里面是什么?
for item in dfs:print(item, type(item))下面是输出结果
为pandas.core.frame.DataFrame列表读取出来的内容为pandas.core.frame.DataFrame列表,读取到几个表格(本例2个),这里列表长度就是几。
然后,我们将这个pdf文件中表格存储为csv格式的表格输出。执行下面代码。
tabula.convert_into(input_path="test.pdf",output_path="test.csv",encoding='GBK',output_format='csv')效果如下:
csv文件内容同样,我们可以使用area参数获取指定区域的内容。
dfs = tabula.read_pdf('test.pdf', pages='all', area=[[120.1,200.5,300.1,500.2], [10.0,30.2,100.5,400.2]])print(dfs, len(dfs))输出结果如下
获取的表格内容那么,area和relative_area这两个参数是如何来设置的?有些参数我们还是一知半解!下文进行详细介绍。有用过这个模块的小伙伴么?欢迎大家下方留言。一起学习。
好了,今天的内容就到这里,喜欢Python编程的小伙伴关注我,后续推出更加精彩的内容。