今天发布了最新的人口普查结果,笔者拿到的文件是pdf格式(网上应该有)。之前就一直想实现从pdf提取表格数据,输出为excel。正好这次有公开数据,因此打算用来练个手。

尝试了两种方法:

1.python的pdfplumber包:利用pdfpumber中的extract_table()方法,可以直接将pdf中表格抽取转换成excel,但是对于不规则的表格(比如有合并单元格、分布在两页中)抽取效果不太理想

2. python+百度智能云的文字识别:需要把pdf先转换成图片,再通过图片识别完成(其实。。。感觉有些多此一举。。。),不过对于边框有缺失的表格感觉效果一般。

以下是用 python+百度智能云的文字识别抽取表格信息的步骤:

零经验新手第一次尝试,正好写的稍微细致一些

声明:代码使用python3实现

!!!前期准备

1. 注册百度智能云账号:也可以用百度云账号。需要完成实名认证,并进行刷脸认证(这一步被迫下载了百度智能云app,吐槽!!为什么要另外下载app,用百度云app不香么。。。)

2. 登录百度智能云并开通通用文字识别的应用:在这个官方网站里https://ai.baidu.com/tech/ocr/general选择免费使用就行(新手练习的次数够了,我爱开放平台!)

百度智能云界面-全局

3. 创建应用:这一步是为了获取后续请求接口时需要使用到的API Key和Secret Key,个人理解有点像用户名和密码,发送请求和获取结果接口的时候需要使用到。点击上图中左边栏的”文字识别“,然后出现下图的界面后,点击”创建应用”即可。具体该怎么创建,也可以百度搜索,此处省略一些描述。。。

创建应用的界面

!!!python准备

!!给python安装sdk:

csdn里搜到的安装sdk的代码是:

pip install baidu-aip

百度云官网提供的讲解视频里写的安装sdk代码是:(视频讲解地址:https://cloud.baidu.com/doc/APIGUIDE/s/Ek1mzbeek)

pip install bce-python-sdk

我也不知道哪个是对的或者有用的,所以都安装了。。。(求大佬指点)

也可以从百度云官网下载sdk包,手动安装:https://cloud.baidu.com/doc/Developer/index.html

!!!终于可以进入正文了,代码实现

本次测试的图片来自今天最新发布的人口普查分析。因为百度文字识别不能识别pdf,只能用图片,所以先把pdf里表格部分截图(从这步开始,此方法就不适合多表格多页PDF了。。)

测试用的人口普查数据图片

具体的实现代码如下:

【步骤一:获取access toke】

官网的说明文档里面提供了代码示例和说明,网址如下:https://ai.baidu.com/ai-doc/REFERENCE/Ck3dwjhhu

import requests  #在第一、二、三步都需要调用
import base64    #在第二、三步需要调用'''
使用百度智能云的表格文字识别(异步接口)获取图片中表格数据
'''#步骤一:获取Access token# 需要将官方文档中提供的host中client_id=【官网获取的AK】&client_secret=【官网获取的SK】的黑框内容替换
# client_id 为官网获取的AK, client_secret 为官网获取的SK
host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=【官网获取的AK】&client_secret=【官网获取的SK】'
response = requests.get(host)
response = requests.get(host)
if response:#print(response.json())  官网代码示例中给的,打印返回结果,可以查看返回的内容#print(type(response.json())) 我自己加的,打印返回结果的类型,发现是一个字典#需要取键名为“access_token”的valuetoken_result = response.json()access_token = token_result.get('access_token')print(access_token)

通用场景文字识别中的表格文字识别(异步接口)官方说明中提供了代码示例(墙裂推荐阅读!!),网址如下:https://cloud.baidu.com/doc/OCR/s/Ik3h7y238

【步骤二:提交请求接口】

按照官网的说明,这一步可以通过调整参数is_sync,实现同步获取识别结果。(下次可以试试~)

​#步骤二:提交请求接口#请求URL,从上面提到的官方说明中查到的,不用修改,直接粘过来
request_url = "https://aip.baidubce.com/rest/2.0/solution/v1/form_ocr/request"# 二进制方式打开图片文件,把图片文件与本代码文件保存在一个文件夹里
f = open('全国人口年龄构成.png', 'rb')
img = base64.b64encode(f.read())#请求主体,image是必选参数,其他可选参数详见官方说明
params = {"image":img}#access_token来自第一步,即调用鉴权接口获取的token
request_url = request_url + "?access_token=" + access_token
headers = {'content-type': 'application/x-www-form-urlencoded'}
response = requests.post(request_url, data=params, headers=headers)
if response:# print (response.json())  这是官网提供的代码示例,如成功返回,则应该是一个包含了键名为 'result'和'log_id'的字典# 成功返回结果的文件结构如下:{'result': [{'request_id': '一串字符'}], 'log_id': 一串数字}#从返回结果文件中获取后续步骤需要用到的request_id和log_idresult = response.json()result_id = result.get('result')   request_id = result_id[0].get('request_id')   #说明:result_id是一个含有一个值的列表,而这个值的类型是字典。log_id = result.get('log_id')print (request_id, log_id)​  #查看是不是成功获取

【步骤三:获取结果接口】

基本上就是步骤二的代码,但是注意更新URL,因为获取结果接口的URL提交请求接口的URL不同

#步骤三:获取结果接口#请求URL,注意与提交请求时的URL不一样!从官方文档获取,直接黏贴即可,不要修改
request_url = "https://aip.baidubce.com/rest/2.0/solution/v1/form_ocr/get_request_result"#请求主体,可以传递两个参数:request_id和result_type,详见官方文档
#request_id: 必选参数,来自第二步的返回结果
#result_type:可选参数,可以选择传回结果类型为Excel还是json,默认为Excel
params = {"request_id":request_id}  #access_token来自第一步
request_url = request_url + "?access_token=" + access_token
headers = {'content-type': 'application/x-www-form-urlencoded'}
response = requests.post(request_url, data=params, headers=headers)
if response:print (response.json())
#response.json()是返回一个字典类型对象

因为采用的传回结果类型是excel, 所以response.json()对象中有一个'result_data'键,这个’result_data'键值是一个网址,将网址复制黏贴到浏览器里,会弹出提示下载excel的提示框

下载后就是本次图片的表格文字识别的结果,结果包含多个sheet,包括表格主体内容、表格标题等,见下图:

识别出的表格内容主体

识别出的表格标题

猜测,因为图片中的表格内容中间没有框线,所以不同行的内容都在一个单元格里了。

总之,效果一般般。对于没有框线或者框线部分缺失的表格,慎用

人口普查分析:利用python+百度文字识别提取图片中的表格数据相关推荐

  1. 通过Python的pdfplumber库提取pdf中表格数据

    文章目录 前言 一.pdfplumber库是什么? 二.安装pdfplumber库 三.查看pdfplumber库版本 四.提取pdf中表格数据 1.引入库 2.定义pdf文件路径 3.打开pdf文件 ...

  2. Python编程:通过百度文字识别提取表格数据

    百度文字识别文档: https://ai.baidu.com/docs#/OCR-Python-SDK/top 安装sdk pip install baidu-aip 先创建应用,得到appid 要识 ...

  3. Python 图像文字识别提取的两种简单方案(Windows)

    百度文字识别API参考:https://www.jianshu.com/p/816cc6ef571b 本地tesseract_ocr参考:https://blog.csdn.net/jclian91/ ...

  4. 【2】Python 视频文字识别提取 - Mp3 文字识别

    网络上没有很好的库用来文字识别,并且文字识别效率很低,这里我用了剪映接口 jianying.py from datetime import dateimport requests import jso ...

  5. Python3-word文档操作(五):利用python修改word文档中的表格数据

    1. 简介: 本篇继续学习python操作word文档的相关知识.本篇主要学习: 1)如何获取一个已经存在文档中的表格的内容: 2)如何修改一个已经存在文档中的表格的内容: 2. 获取word文档中的 ...

  6. 调用百度文字识别API

    调用百度文字识别API 一.实验目的 1.构建一个文字识别系统: 2.利用Python实现文字识别; 3.掌握百度AI平台的使用: 4.掌握调用百度API实现文字识别. 二.实验原理 登录百度智能云a ...

  7. Python 利用百度文字识别 API 识别并提取图片中文字

    Python 利用百度文字识别 API 识别并提取图片中文字 利用百度 AI 开发平台的 OCR 文字识别 API 识别并提取图片中的文字.首先需注册获取 API 调用的 ID 和 key,步骤如下: ...

  8. Python 利用百度文字识别验证码、文字、图片并提取图片中文字或数字

    Python 利用百度文字识别验证码.文字.图片并提取图片中文字或数字 Python 利用百度文字识别验证码.文字.图片并提取图片中文字或数字 以下是代码实现, Python 利用百度文字识别验证码. ...

  9. python 百度ocr安装_Python利用百度文字识别(OCR)服务实现图片文字提取,准确率超高...

    最近和朋友聊天,聊到一个充满使命感但又略显心酸的话题--下班回家在网上给小朋友抄题...那么问题来了,除了大家所知的QQ文字识别功能之外,还有哪些方式可以做到文字识别呢. 作为一名热心的Python小 ...

最新文章

  1. Verilog设计实例(7)基于Verilog的数字电子钟设计
  2. c语言笔试题(带答案)
  3. C# 学习笔记(9)线程
  4. hdu 2881(简单dp)
  5. windows环境下OpenLDAP安装与客户端连接配置
  6. python基础-类
  7. JQuery Datatables editor 本地编辑功能
  8. python基础之面向对象编程
  9. 马云:青山不改绿水长流,后会有期
  10. cuSPARSE库:(九)cusparseSetStream()
  11. javascript 设计模式_用英雄联盟的方式讲解JavaScript设计模式(二)
  12. Python中fastapi构建的web项目配置环境变量
  13. 百度2013校园招聘移动软件研发工程师笔试题(一)
  14. 让你彻底理解信用评分卡原理(Python实现评分卡代码)
  15. base64加密原理
  16. 十月上旬百度 阿里巴巴 迅雷搜狗最新面试七十题 第201 270题
  17. APS Interview - Digital Circuit and Digital Logic I
  18. 变分法 (Calculus of Variations)
  19. can收发器 rx_CANOpen系列教程03_CAN收发器功能、原理及作用
  20. Oracle物化视图与物化视图日志

热门文章

  1. SmartX联手沃云打造全新超融合公有云背后技术解析
  2. 用树莓派组装了一台电脑
  3. 【Unity】入门学习笔记180605——游戏动画设计(4)——游戏角色动画基础
  4. 车载网络测试 - 车载以太网 - Tester和DUT的IP、MAC、Logical addr设置
  5. 计组 | 寻址范围的概念与数据寄存器的位数
  6. 如何搭建一个自己的图床
  7. Android SurfaceFlinger SW Vsync模型
  8. 【k8s】 k8s | 一 | 介绍
  9. Unity 检测手机性能,区分高中低端机型
  10. OccuSeg: Occupancy-aware 3D Instance Segmentation