【办公自动化】用Python批量从上市公司年报中获取主要业务信息

news2025/1/10 19:04:59

🤵‍♂️ 个人主页:@艾派森的个人主页

✍🏻作者简介:Python学习者
🐋 希望大家多多支持,我们一起进步!😄
如果文章对你有帮助的话,
欢迎评论 💬点赞👍🏻 收藏 📂加关注+


目录

一、Python处理PDF

二、用Python将PDF文件转存为图片

三、往期推荐

四、文末推荐与福利 


一、Python处理PDF

  • Python处理PDF的好处

  1. 自动化和批量处理:使用Python,你可以自动处理大量的PDF文件,例如从扫描仪生成的文档、报告、合同等。这可以节省大量时间和努力,尤其是在需要重复性任务时。

  2. 文本提取:Python可以轻松地从PDF中提取文本内容,使其可搜索、可编辑和可分析。这对于文本分析、数据挖掘和文档检索等任务非常有用。

  3. 报告生成:你可以使用Python创建自定义的PDF报告,将数据、图表和图像等信息以专业的方式呈现。这对于生成自动化的业务报告、数据可视化和数据分析很有帮助。

  4. PDF编辑:Python库和工具使你能够合并、拆分、旋转、裁剪和编辑PDF文件的页面。这对于在不使用专业PDF编辑软件的情况下进行简单的文档编辑很有用。

  5. 图像提取:Python允许你从PDF文件中提取图像,这对于处理包含图形、图表和图片的文档非常有帮助。

  6. 数据提取:当PDF文件包含表格或结构化数据时,Python可以用于提取和转换这些数据,以便进一步分析或导入到数据库中。

  7. 自定义处理:Python提供了多种用于PDF处理的库,允许你根据项目的需求进行自定义处理。你可以选择适合你需求的库,以满足具体要求。

  8. 跨平台:Python是跨平台的,因此你可以在不同操作系统上运行相同的代码,而无需担心兼容性问题。

Python处理PDF文件的主要第三方库包括:

  1. PyPDF2:PyPDF2是一个用于处理PDF文件的库,可以用于提取文本、合并、拆分和旋转PDF文件的页面。它还支持添加页面、水印和书签等功能。

  2. ReportLab:ReportLab是一个用于创建PDF文件的库,允许你以编程方式构建PDF文档,包括添加文本、图像、表格等。

  3. PDFMiner:PDFMiner是一个用于提取文本和元数据的PDF处理库。它可以解析PDF文件并提取文本、布局信息和链接等。

  4. pdf2image:pdf2image是一个用于将PDF文件转换为图像的库,这对于处理包含图形的PDF文件非常有用。

  5. fpdf2:fpdf2是一个用于创建PDF文件的库,支持自定义字体、图像和表格等。

  6. PyMuPDF:PyMuPDF是一个用于处理PDF文件的库,可以用于提取文本、图像和元数据。它还支持PDF文件的渲染和转换为图像。

  7. Camelot:Camelot是一个用于提取表格数据的库,特别适用于从PDF文件中提取表格数据。

  8. Tabula-py:Tabula-py是一个用于提取表格数据的库,可将PDF中的表格转换为DataFrame对象。

  • 开发环境

操作系统:使用windows, mac都可以

Python版本:系统中需要安装Python3.6以上的版本,Python2已经过期不建议使用,Python3.6以前的版本功能相对弱,最好就是采用Python3.6以上的版本

开发工具:有两个可以选择,jupyter notebook,是个网页编辑器,可以运行Python,常常用于交互性、探索性的开发;pycharm,用于成熟脚本,或者web服务的一些开发;这两个工具可以随意选择。

二、用Python将PDF文件转存为图片

技术工具:

Python版本:3.9

代码编辑器:jupyter notebook

        要求批量从上市公司年报中截取公司从事的主要业务信息,以便进行后续的分析。首先我们要分析一下上市公司年报的结构,及目标信息所在位置。一般上市公司的年报都是公开的,可随意下载。其格式一般是PDF。年报内容包含的板块几乎相同,只是深圳市场与上海市场略有区别。随机挑选了10家上市公司的年报(如下图)。可见,公司业务都位于“第三节公司业务概要”,只是上海市场的年报,“第三节”后有空格。其所在页基本在8,9,10页。“第三节”里的第一个小标题,两个市场也有点不同。主要业务介绍完后,接下来都是介绍“主要资产重大变化情况”,这部分及以后的内容都不是我们想要的。因此,打算确定关键词“公司业务概要”及“重大变化情况”,作为文字截取的起始关键词。当然,如果年报中还有其它内容也涉及到这两个词,就会造成干扰。保险起见,在PDF文档内搜索一下,运气不错,这两个关键词在文档中是唯一的,也就是只在这两个地方出现。那就可以放心干了。

        以下,先随便找一家上市公司的年报来测试一下。先导入`pdfplumber`模块,用于提取Pdf文件中的文字(也可以用PyPDF2模块,但读取中文容易出错,因此放弃)。然后设定关键词“重大变化情况”,作为停止搜索标志(这个词后面的内容不是我们想要的)。再打开PDF文件,从第7页开始提取文字,26页终止(因为绝大部分年报的“主要业务”内容在8~15页,有个别到23页了)。将每页的文字信息存入`data`字典。再用`if`语句设定一个终止程序,即当关键词“重大变化情况”出现在当页的内容中时,就停止后续的读取了,因为后续读取到的内容已经不是我们想要的了。这样可以节省时间。打个比方,如果我们要的内容在8~9页,程序只会提取7~9页的内容,后面就不会再提取了。 

#获取年报中的“主要业务”信息
import pdfplumber
file = r"年报\东旭蓝天:2019年年度报告.PDF" 
data = []
key_words = "重大变化情况"
with pdfplumber.open(file) as p:
    for i in range(6,26): #公司主要业务主要年报的在8~23页范围内
        page = p.pages[i] #选页
        page_text = page.extract_text() #提取文字
        data.append(page_text) #将提取的文字加入列表
        if key_words in page_text: #到结束关键词即结束抓取信息,避免浪费时间
            break # 终止for循环

得到的结果如下:

data

        然后,我们就用开始关键词“公司业务概要”和结束关键词“重大变化情况”来截取二者之间的文字。先定义一个文字截取函数,传入起始关键词,及待处理的字符串。通过`find()`方法确定起始关键词对应的位置索引,然后截取二者之间的字符。 

#从字符串中提取指定首尾的文字
def Get_text(start_str, end_str, source_str):
    start = source_str.find(start_str) #找到开始关键词对应的位置索引
    if start >= 0:
        start += len(start_str)
        end = source_str.find(end_str, start)#找到结束关键词对应的位置索引
        if end >= 0:
            return source_str[start:end].strip() #截取起始位置之间的字符
#将数据列表`data`转换成一个大字符串
source_str = "".join(data)
#截取文字
start_str = "公司业务概要"
end_str = "重大变化情况"
text_wanted = Get_text(start_str, end_str, source_str)
text_wanted

        以上,就把想要的内容基本提取出来了。但最后那个几个字“二、主要资产”不是我们要的,因此需要将其去除。先将以上字符串`text_wanted`按照换行符“\n”进行分割,在砍掉最后一个元素,即可得到最终想要的字符串。

final_text = text_wanted.split("\n")[:-1]
final_text

将以上字符串写入txt文件,并按公司名称命名保存。写入的txt文件结果如下:

#定义写入txt的函数
def To_txt(filename, final_text):#filename为写入文件的路径,data为要写入数据列表.
    file = open(filename + '.txt','w',encoding="utf-8")
    file.write(filename + "\n")
    for i in range(len(final_text)):
        text = final_text[i]
        if i != len(final_text)-1: #判断是否最后一个元素
            text = text+'\n'   #若不是最后一个元素才换行
        file.write(text)
    file.close()
    
    
To_txt(r"年报\东旭蓝天:2019年年度报告",final_text)

        成功搞定一个之后,我们就可以批量处理了。将待处理的年报放入指定路径,然后获取其路径,存入列表`files`。稍微整合一下程序,运行。10份年报,用时144秒,平均1份年报14秒。

#获取待处理的年报的路径
import os
path='年报'  #文件所在文件夹
files = [path+"\\"+i for i in os.listdir(path)] #获取文件夹下的文件名,并拼接完整路径
files

 

import pdfplumber
import time
time0= time.time()
#从字符串中提取指定首尾的文字
def Get_text(start_str, end_str, source_str):
    start = source_str.find(start_str) #找到开始关键词对应的位置索引
    if start >= 0:
        start += len(start_str)
        end = source_str.find(end_str, start)#找到结束关键词对应的位置索引
        if end >= 0:
            return source_str[start:end].strip() #截取起始位置之间的字符

#定义写入txt的函数
def To_txt(filename, final_text):#filename为写入文件的路径,data为要写入数据列表.
    file = open(filename + '.txt','w',encoding="utf-8")
    file.write(filename + "\n")
    for i in range(len(final_text)):
        text = final_text[i]
        if i != len(final_text)-1: #判断是否最后一个元素
            text = text+'\n'   #若不是最后一个元素才换行
        file.write(text)
    time.sleep(0.1) #加入一个延时,避免批量写入出现乱码
    file.close()
    
#获取年报中的“主要业务”信息
for file in files:
    data = []
    key_words = "重大变化情况"
    with pdfplumber.open(file) as p:
        for i in range(6,26): #公司主要业务主要年报的在8~23页范围内
            page = p.pages[i] #选页
            page_text = page.extract_text() #提取文字
            data.append(page_text) #将提取的文字加入列表
            if key_words in page_text: #到结束关键词即结束抓取信息,避免浪费时间
                break # 终止for循环        

    #将数据列表`data`转换成一个大字符串
    source_str = "".join(data)
    #截取文字
    start_str = "公司业务概要"
    end_str = "重大变化情况"
    text_wanted = Get_text(start_str, end_str, source_str)
    #去掉不需要的尾巴
    final_text = text_wanted.split("\n")[:-1]
    new_file = "主要业务\\" + file.split("\\")[1][:-4]

    To_txt(new_file,final_text)
    print("{} 处理完成!".format(new_file))
    
time1= time.time()
print("处理完成,共用时 {} 秒。".format(time1-time0))

 

三、往期推荐

Python提取pdf中的表格数据(附实战案例)

使用Python自动发送邮件

Python操作ppt和pdf基础

Python操作word基础

Python操作excel基础

使用Python一键提取PDF中的表格到Excel

 使用Python批量生成PPT版荣誉证书

使用Python批量处理Excel文件并转为csv文件

四、文末推荐与福利 

清华社【秋日阅读企划】领券立享优惠

IT好书 5折叠加10元无门槛优惠券:https://u.jd.com/Yqsd9wj

活动时间:9月4日-9月17日,先到先得,快快来抢!

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1009456.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电力系统优化:数字孪生的革新方法

数字孪生技术在电力系统中能够发挥令人瞩目的作用。这项技术不仅可以提高电力系统的可靠性和效率,还有助于降低能源浪费和环境影响。本文将深入探讨数字孪生技术在电力领域的多个关键应用领域,以展示其潜力和重要性。 数字孪生技术可以创建电力设备的虚拟…

农村怎样利用光伏发电?

随着经济快速发展,光伏、风电等可再生能源在农村地区普及率越来越高,极大推动了农业产业发展,提高了农民收入,改善了农村生态环境,促进了乡村各项工作健康发展。 光伏+农业是一种新兴的农业形式&#xff0…

如何获取美团的热门商品和服务

导语 美团是中国最大的生活服务平台之一,提供了各种各样的商品和服务,如美食、酒店、旅游、电影、娱乐等。如果你想了解美团的热门商品和服务,你可以使用爬虫技术来获取它们。本文将介绍如何使用Python和BeautifulSoup库来编写一个简单的爬虫…

文件上传漏洞~操作手册

目录 上传文件一般过滤方式 客服端校验 服务端校验 黑白名单机制 常规文件上传漏洞绕过 客户端绕过 1.游览器禁用JavaScript 2.正常burp suite抓包改包 服务端绕过 1.Content-Type绕过 2.黑名单绕过 1)命名规则绕过 2)大小写绕过 3&#x…

jvm的调优工具

1. jps 查看进程信息 2. jstack 查看进程的线程 59560为进程id 产生了死锁就可以jstack查看了 详细用途可以看用途 3. jmap 如何使用dump文件看下 查看 4.jstat 空间占用和次数 5. jconsole可视化工具 各种使用情况,以及死锁检测 6. visualvm可视化工具…

如何使用ArcGIS Pro提取河网水系

DEM数据除了可以看三维地图和生成等高线之外,还可以用于水文分析,这里给大家介绍一下如何使用ArcGIS Pro通过水文分析提取河网水系,希望能对你有所帮助。 数据来源 本教程所使用的数据是从水经微图中下载的DEM数据,除了DEM数据&a…

导入发运地点wsh_locations

当客户上的地址变更之后,发运事务处理上的地址还是原来的地址,发运上的地址来源table wsh_locations. 解决办法:运行接口请求,导入发运地点,日期可以范围包括地点变更的日期。 请求完成后再次查看地址发现地址已变更…

iwebsec靶场 文件包含漏洞通关笔记10-data伪协议利用

目录 前言 1.data伪协议 2.使用条件 第10关 data://伪协议利用 1.打开靶场 2.源码分析 3.渗透 (1)明文渗透 (2)base64编码渗透 前言 1.data伪协议 data协议和input协议差不多,指定data是get方法,…

从零基础到精通Flutter开发:一步步打造跨平台应用

💂 个人网站:【工具大全】【游戏大全】【神级源码资源网】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 导言 Flutter是一种流行…

QLabel 显示圆图并且含有边框 border-image

在一个label上流动显示头像,并且不能遮挡边框(如头像1-3),不想放两个label堆叠,所以最后采用了下述方法解决 1.设置边框还有图片 2.设置图片自适应 3.将头像切割成圆形 QPixmap pixmap QPixmap::fromImage(img); …

微信创建会员卡-47001错误

文档:1.新版会员卡介绍 | 微信开放文档 错误: 47001解析 JSON/XML 内容错误 接口: HTTP请求方式: POSTURL:https://api.weixin.qq.com/card/create?access_tokenACCESS_TOKEN 原因: 参数设置错误:["swipe_car…

JavaScript的基本数据类型如何使用?

JavaScript中的数据类型分为两大类,分别是基本数据类型和复杂数据类型(或称为引用数据类型),如图所示。 本节重点讲解基本数据类型。下面我们用代码演示基本数据类型的使用。 (1)数字型(Number),包含整型值和浮点型值: var numl 21; …

清华智能体宇宙火了;主流大语言模型的技术原理细节

🦉 AI新闻 🚀 清华智能体宇宙火了 摘要:清华大学联合北邮、微信团队推出了AgentVerse,这是一个可以轻松模拟多智能体宇宙的环境。它专为大语言模型开发,智能体可以利用LLM能力完成任务。AgentVerse提供了几个示例环境…

谷歌翻译API接口,翻译API接口,翻译API接口申请指南

Google翻译API是一种可以在多个平台上使用的Web服务,通过使用该API,用户可以将任何文本转换成多种语言,同时也可以将多种语言转换成用户指定的语言。目前Google翻译API支持超过100种语言,涵盖了全球范围内的所有主流语言。 Googl…

gradio的基础教程

接口 gradio.Interface(fn, inputs, outputs, ) 描述 界面是Gradio的主要高级类,允许您在几行代码中围绕机器学习模型(或任何Python函数)创建基于Web的GUI /演示。您必须指定三个参数:(1) 为 (…

怎么科学管理固定资产呢

在当今的商业环境中,固定资产的管理是企业成功的关键因素之一。然而,传统的固定资产管理方法往往过于繁琐,缺乏创新,导致资源的浪费和效率的低下。因此,我们需要一种新的、更加科学的方法来管理我们的固定资产。本文将…

QT基础教程(GUI程序原理分析)

文章目录 前言一、命令行应用程序的特点二、图形界面应用程序的特点三、图形界面程序适用场景总结 前言 本篇文章正式带大家开始学习QT基础部分的内容,后面将更新一套完整的QT教程,包括QT基础,QT进阶,QT项目,QT企业级…

webpack打包速度优化

优化WebPack打包速度 在开发过程中,WebPack的打包速度是一个非常重要的考虑因素。随着项目规模的增长,打包时间也会越来越长,影响开发效率和用户体验。本文将循序渐进地介绍一些优化WebPack打包速度的方法,先分析打包瓶颈&#x…

ARM Linux DIY(九)陀螺仪调试

前言 今天调试六轴陀螺仪 MPU6050 硬件 硬件很简单,使用 I2C 接口,并且没有使用中断引脚。 焊接上 MPU6050 芯片和上拉电阻、滤波电容。 检测 MPU6050 是挂在 I2C-0 上的,I2C-0 控制器的驱动已 OK,所以直接使用 I2C-0 检测 …

hive工具-zeppelin部署

zeppelin部署 解压安装包至/opt/soft 并改名 /etc/proofile中配置环境变量并source生效 #ZEPPELIN export ZEPPELIN_HOME/opt/soft/zeppelin010 export PATH$ZEPPELIN_HOME/bin:$PATH (1)conf目录下拷贝一份初始配置文件 [rootkb129 conf]# pwd /opt/s…