import os
import re
import fitz
import csv
filenames = os.listdir()
prefix = '公开发行证券的公司信息披露内容与格式准则第2号'
pdf = [f for f in filenames if f.startswith(prefix) and f.endswith('.pdf')]
year = [f[-12:-5] for f in pdf]
for f in pdf:
print(f)
print(year)
公开发行证券的公司信息披露内容与格式准则第2号——年度报告的内容与格式(2012年修订).pdf 公开发行证券的公司信息披露内容与格式准则第2号——年度报告的内容与格式(2016年修订).pdf 公开发行证券的公司信息披露内容与格式准则第2号——年度报告的内容与格式(2017年修订).pdf 公开发行证券的公司信息披露内容与格式准则第2号——年度报告的内容与格式(2021年修订).pdf ['2012年修订', '2016年修订', '2017年修订', '2021年修订']
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):
subtext = getSubtext(pdf)
p = re.compile('(?<=\\n)(第\w{1,2}节)\s+(.*)(?=\\n)')
listOftuple = p.findall(subtext)
return(listOftuple)
toc = [getTOC(f) for f in pdf]
for t in toc:
for item in t:
print(item)
print('\n')
Deprecation: 'getText' removed from class 'Page' after v1.19 - use 'get_text'.
('第一节', '重要提示、目录和释义') ('第二节', '公司简介') ('第三节', '会计数据和财务指标摘要') ('第四节', '董事会报告') ('第五节', '重要事项') ('第六节', '股份变动及股东情况') ('第七节', '董事、监事、高级管理人员和员工情况') ('第八节', '公司治理') ('第九节', '内部控制') ('第十节', '财务报告') ('第一节', '重要提示、目录和释义') ('第二节', '公司简介和主要财务指标') ('第三节', '公司业务概要') ('第四节', '经营情况讨论与分析') ('第五节', '重要事项') ('第六节', '股份变动及股东情况') ('第七节', '优先股相关情况') ('第八节', '董事、监事、高级管理人员和员工情况') ('第九节', '公司治理') ('第十节', '公司债券相关情况') ('第十一节', '财务报告') ('第十二节', '备查文件目录') ('第一节', '重要提示、目录和释义') ('第二节', '公司简介和主要财务指标') ('第三节', '公司业务概要') ('第四节', '经营情况讨论与分析') ('第五节', '重要事项') ('第六节', '股份变动及股东情况') ('第七节', '优先股相关情况') ('第八节', '董事、监事、高级管理人员和员工情况') ('第九节', '公司治理') ('第十节', '公司债券相关情况') ('第十一节', '财务报告') ('第十二节', '备查文件目录') ('第一节', '重要提示、目录和释义') ('第二节', '公司简介和主要财务指标') ('第三节', '管理层讨论与分析') ('第四节', '公司治理') ('第五节', '环境和社会责任') ('第六节', '重要事项') ('第七节', '股份变动及股东情况') ('第八节', '优先股相关情况') ('第九节', '债券相关情况') ('第十节', '财务报告')
def getToc_new(pdf):#取后面紧跟的节标题,用于后续从匹配中所获取的正文中去除相应的节标题
toc = getTOC(pdf)
toc_want = []
for i in range(len(toc)):
toc_of_new = toc[i][1]
toc_want.append(toc_of_new)
return(toc_want)
def getToc_new2(pdf):#取“第*节”对应的内容,用于后续正则匹配
toc = getTOC(pdf)
toc_want1 = []
for i in range(len(toc)):
toc_of_new2 = toc[i][0]
toc_want1.append(toc_of_new2)
return(toc_want1)
toc_new = [getToc_new(f) for f in pdf]
toc_new2 = [getToc_new2(f) for f in pdf]
for i in toc_new[0]:#为了简化,这里只做一次循环用于展示
print(i)
for j in toc_new2[0]:
print(j)
重要提示、目录和释义 公司简介 会计数据和财务指标摘要 董事会报告 重要事项 股份变动及股东情况 董事、监事、高级管理人员和员工情况 公司治理 内部控制 财务报告 第一节 第二节 第三节 第四节 第五节 第六节 第七节 第八节 第九节 第十节
def getTOC_content(pdf):
subtext = getSubtext(pdf)
toc_new = getToc_new(pdf)
toc_new2 = getToc_new2(pdf)
content = []
for i in range(len(toc_new2)-1):#由于最后一节内容需要单独提取,所以循环减一次
p = re.compile(toc_new2[i]+"\n*?\s*?"+toc_new[i]+"(.*)"+toc_new2[i+1],re.DOTALL)#想的正则表达式,用于循环进行匹配
content_of = p.findall(subtext)
content_of = content_of[0].replace("\n","")#将文本中的换行符用空格替换,避免网页出现"\n"的字符串
content.append(content_of)
q = re.compile(toc_new2[-1]+"\n*?\s*?"+toc_new[-1]+"(.*)"+"第三章",re.DOTALL)#单独对最后一节进行正则匹配,获取正文内容
content_of_new = q.findall(subtext)
content_of_new = content_of_new[0].replace("\n","")
content.append(content_of_new)
return(content)
list_of_content = [getTOC_content(f) for f in pdf]
def export_to_html(pdf,toc,content,year):
f = open('homework3_output_template.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]
div = [template % (t,c) for (t,c) in zip(toc_list, content)]
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(list_of_content)):
export_to_html(pdf[i], toc[i],list_of_content[i],year[i])