第三次作业:年报格式准则解析

姓名 性别 学号
张佳静 0194966

导入模块和文件

In [2]:
import pdfplumber
import os
import re
import fitz
import csv

os.chdir('D:\金融数据\.spyder-py3')
filenames=os.listdir('D:\金融数据\.spyder-py3')
prefix='公开发行证券的公司信息披露内容与格式准则第2号'
pdf=[f for f in filenames if f.startswith(prefix) and f.endswith('.pdf')]

year=[f[-12:-5] for f in pdf]
#提取年份

定义目录提取函数

In [3]:
def getText(pdf):
    text=''
    doc=fitz.open(pdf)
    for page in doc:
        text +=page.getText()
    doc.close()
    return(text)
#提取年报内容

def getSubtext(pdf):
    text=getText(pdf)
    p1=re.compile('第二章\s*年度报告正文(.*)第三章\s*年度报告摘要',re.DOTALL)
    subtext=p1.search(text).group(0)
    return(subtext)
#提取年报第二章节

def getTOC(pdf):
    text=getText(pdf)
    p1=re.compile('第二章\s*年度报告正文(.*)第三章\s*年度报告摘要',re.DOTALL)
    subtext=p1.search(text).group(0)
    p=re.compile('(?<=\\n)(第\w{1,2}节)\s+(.*)(?=\\n)')
    listOftuple=p.findall(subtext)
    return(listOftuple)
#获取目录

提取目录

In [4]:
toc=[getTOC(f) for f in pdf]

for t in toc:
    for item in t:
        print(item)
    print('\n')
('第一节', '重要提示、目录和释义')
('第二节', '公司简介')
('第三节', '会计数据和财务指标摘要')
('第四节', '董事会报告')
('第五节', '重要事项')
('第六节', '股份变动及股东情况')
('第七节', '董事、监事、高级管理人员和员工情况')
('第八节', '公司治理')
('第九节', '内部控制')
('第十节', '财务报告')


('第一节', '重要提示、目录和释义')
('第二节', '公司简介和主要财务指标')
('第三节', '公司业务概要')
('第四节', '经营情况讨论与分析')
('第五节', '重要事项')
('第六节', '股份变动及股东情况')
('第七节', '优先股相关情况')
('第八节', '董事、监事、高级管理人员和员工情况')
('第九节', '公司治理')
('第十节', '公司债券相关情况')
('第十一节', '财务报告')
('第十二节', '备查文件目录')


('第一节', '重要提示、目录和释义')
('第二节', '公司简介和主要财务指标')
('第三节', '公司业务概要')
('第四节', '经营情况讨论与分析')
('第五节', '重要事项')
('第六节', '股份变动及股东情况')
('第七节', '优先股相关情况')
('第八节', '董事、监事、高级管理人员和员工情况')
('第九节', '公司治理')
('第十节', '公司债券相关情况')
('第十一节', '财务报告')
('第十二节', '备查文件目录')


('第一节', '重要提示、目录和释义')
('第二节', '公司简介和主要财务指标')
('第三节', '管理层讨论与分析')
('第四节', '公司治理')
('第五节', '环境和社会责任')
('第六节', '重要事项')
('第七节', '股份变动及股东情况')
('第八节', '优先股相关情况')
('第九节', '债券相关情况')
('第十节', '财务报告')


提取目录内容

In [5]:
def getTOC_Content(pdf):
    subtext=getSubtext(pdf)
    p=re.compile('(?<=\\n)(第\w{1,2}节)\s+(.*)(?=\\n)')
    index=[]
    for match in p.finditer(subtext):
        s=match.start()
        e=match.end()
        index.append((s,e))
    content=[]
    for i in range(len(index)-1):
        s=index[i][1]
        e=index[i+1][0]
        content.append(subtext[s:e])
    last_start=index[-1][1]
    last_end=subtext.rfind('\n第三章')
    content.append(subtext[last_start:last_end])
    return((index,content))
#定义函数

list_of_content = [getTOC_Content(f) for f in pdf]
content_list = [c[1] for c in list_of_content]

保存至html

In [6]:
def export_to_html(pdf,toc,content,year):
    f=open('homework3.html',encoding='utf=8')
    html=f.read()
    f.close()
    template='''
    <div>
        <h3>%s</h3>
        <p>%s</p>
    </div>
    '''
    toc_list=[t[0]+' '+t[1] for t in toc[3]]
    div=[template % (t,c) for (t,c) in zip(toc_list,content_list[3])]
    div=''.join(div)
    html=html % div
    f = open('年报格式准则_%s.html' % year, 'w',encoding='utf-8')
    f.write(html)
    f.close()
    return()
#定义函数

for i in range(len(pdf)):
    export_to_html(pdf[i], toc[i], content_list[i],year[i])

最终结果

In [ ]: