excel抓取多页网页数据(一个表格如下:使用pdfplumber提取pdf表格文本输出:第二步)
优采云 发布时间: 2021-11-03 17:19excel抓取多页网页数据(一个表格如下:使用pdfplumber提取pdf表格文本输出:第二步)
pdf 是一种*敏*感*词*文档格式,由 . 由于不受平台限制,保存和传输方便,所以pdf很受欢迎。
目前市面上的pdf工具很多,大部分是阅读,还有一些支持pdf修改、转换等功能,但是这些工具很多都是收费的。
这次介绍一个开源的python工具库-pdfplumber,可以方便的获取pdf的各种信息,包括文本、表格、图表、尺寸等。
pdfplumber在github上有官方英文文档,后面重点讲解,我们来看看如何用pdfplumber提取pdf表格?
以NBA 2020-2021常规赛数据为例,pdf表格如下:
第一步:使用pdfplumber提取表格文本
# 导入pdfplumber<br data-filtered="filtered">import pdfplumber<br data-filtered="filtered"><br data-filtered="filtered"># 读取pdf文件,保存为pdf实例<br data-filtered="filtered">pdf = pdfplumber.open("E:\\nba.pdf") <br data-filtered="filtered"><br data-filtered="filtered"># 访问第二页<br data-filtered="filtered">first_page = pdf.pages[1]<br data-filtered="filtered"><br data-filtered="filtered"># 自动读取表格信息,返回列表<br data-filtered="filtered">table = first_page.extract_table()<br data-filtered="filtered"><br data-filtered="filtered">table<br data-filtered="filtered">
输出:
步骤2:整理成数据框格式并另存为excel
import pandas as pd<br data-filtered="filtered"><br data-filtered="filtered"># 将列表转为df<br data-filtered="filtered">table_df = pd.DataFrame(table_2[1:],columns=table_2[])<br data-filtered="filtered"><br data-filtered="filtered"># 保存excel<br data-filtered="filtered">table_df.to_excel('test.xlsx')<br data-filtered="filtered"><br data-filtered="filtered">table_df<br data-filtered="filtered">
输出:
一个小脚本,不到十行代码,把pdf表格提取出来转换成dataframe格式,最后保存成excel。
有了初步的了解之后,我们来详细说一下pdfplumber的安装、导入、api接口等信息。
pdfplumber简介
pdfplumber的使用我已经介绍过了,我也用一个小案例来展示如何提取表格。我认为pdfplumber只需要理解三点。
1、是纯python第三方库,适用于python 3.x版本
2、 用于查看各类pdf信息,可以有效提取文本和表格
3、 不支持修改或生成pdf,也不支持扫描pdf的处理
Github地址
pdfplumber安装导入
与其他python库一样,pdfplumber支持pip安装。在命令行输入:
pip install pdfplumber<br data-filtered="filtered">
如果遇到安装慢的问题,可以更换镜像源,这样会快很多。
pdfplumber安装后,导入即可使用:
import pdfplumber<br data-filtered="filtered">....<br data-filtered="filtered">
pdfplumber 使用简单
pdfplumber 中有两个基本类,PDF 和 Page。从字面意思可以猜到,前者是对整个文档进行处理,后者是对页面进行处理。
“Pdfplumber.PDF 类”
属性描述
.元数据
获取pdf基本信息,返回字典
.pages
pdfplumber.Page 的实例列表,每个实例代表pdf每一页的信息。
“Pdfplumber.Page 类”
这是pdfplumber的核心功能。pdf上的大部分操作都是基于这个类,包括提取文本、表格、维度等。
它的属性和方法这里就不一一列举了。
通过一个简单的案例,您可以了解它们的作用。示例pdf文档,共两页:
阅读pdf
# 导入pdfplumber<br data-filtered="filtered">import pdfplumber<br data-filtered="filtered"><br data-filtered="filtered"># 读取pdf文件,返回pdfplumber.PDF类的实例<br data-filtered="filtered">pdf = pdfplumber.open("e:\\nba2.pdf")<br data-filtered="filtered">
获取pdf文档的信息
# 通过pdfplumber.PDF类的metadata属性获取pdf信息<br data-filtered="filtered">pdf.metadata<br data-filtered="filtered">
输出:
这些是pdf的基本信息,包括作者、出处、日期等。
总页数
# 通过pdfplumber.PDF类的metadata属性获取pdf页数<br data-filtered="filtered">len(pdf.pages)<br data-filtered="filtered">
读取第一页的页宽、页高等信息
输出:
阅读第一页的文字
# 读取文本<br data-filtered="filtered">text = first_page.extract_text()<br data-filtered="filtered">print(text)<br data-filtered="filtered">
输出:
阅读第二页上的表格
import pandas as pd<br data-filtered="filtered"><br data-filtered="filtered"># 第二页pdfplumber.Page实例<br data-filtered="filtered">first_page = pdf.pages[1]<br data-filtered="filtered"><br data-filtered="filtered"># 自动读取表格信息,返回列表<br data-filtered="filtered">table = first_page.extract_tables()<br data-filtered="filtered"><br data-filtered="filtered"># 将列表转为df<br data-filtered="filtered">table_df = pd.DataFrame(table_2[1:],columns=table_2[])<br data-filtered="filtered"><br data-filtered="filtered">table_df<br data-filtered="filtered">
pdfplumber 在提取表格时有很多细节需要处理。这里给出的示例表的线框图比较标准,所以很容易提取出来,但是对于线框图不完整的表(包括无线盒子),效果就差很多了。
在实际项目中需要处理的pdf文档中,有很多线框图完整和不完整的表格。为了理解pdfplumber实现表单抽取的原理和方法,我们需要仔细研究相关参数的设置。
如案例所示,pdfplumber.Page对象的.extract_table()方法可以提取表格,返回从页面最大表格中提取的文本,并以结构行->单元格的列表形式显示.
《表提取参数设置》
默认情况下,extract_table 使用页面的垂直和水平线(或矩形边缘)作为单元格分隔符。这个方法可以通过 table_settings 参数高度定制。可能的设置及其默认值:
{<br data-filtered="filtered"> "vertical_strategy": "lines", <br data-filtered="filtered"> "horizontal_strategy": "lines",<br data-filtered="filtered"> "explicit_vertical_lines": [],<br data-filtered="filtered"> "explicit_horizontal_lines": [],<br data-filtered="filtered"> "snap_tolerance": 3,<br data-filtered="filtered"> "join_tolerance": 3,<br data-filtered="filtered"> "edge_min_length": 3,<br data-filtered="filtered"> "min_words_vertical": 3,<br data-filtered="filtered"> "min_words_horizontal": 1,<br data-filtered="filtered"> "keep_blank_chars": False,<br data-filtered="filtered"> "text_tolerance": 3,<br data-filtered="filtered"> "text_x_tolerance": None,<br data-filtered="filtered"> "text_y_tolerance": None,<br data-filtered="filtered"> "intersection_tolerance": 3,<br data-filtered="filtered"> "intersection_x_tolerance": None,<br data-filtered="filtered"> "intersection_y_tolerance": None,<br data-filtered="filtered">}<br data-filtered="filtered">
pdfplumber 支持图表的可视化调试,可以输出图像,并展示如何提取表格。
pdfplumber的独特之处
python中有很多可以处理pdf的库,比如PyPDF2、pdfminer等,pdfplumber有什么优点呢?
首先,pdfplumber可以方便的访问PDF对象的所有详细信息,提取文本和表格的方法是高度可定制的,用户可以根据表格的具体形式调整参数。
最重要的是pdfplumber作者继续维护库,同样流行的PyPDF2不再维护。