王妍洁的实验报告

代码一


print('大作业实验报告')
#####运行
import pandas as pd
import numpy as np

import matplotlib.pyplot as plt
from pylab import mpl
import datetime

mpl.rcParams['font.sans-serif']=['FangSong']
mpl.rcParams['axes.unicode_minus']=False
from pandas.plotting import register_matplotlib_converters
register_matplotlib_converters()
import requests
import fitz
import re
import pandas as pd
from pprint import pprint
import os

##需要的股票代码
codes1=['688566',
      '688575',
      '688578',
      '688606',
      '688656',
      '688658',
      '688670',
      '688687',
      '688767',
      '688799']

codes2=['688575',
      '688670',
      '688767' ]

codes3=['688566', 
      '688575',
      '688578', 
#      '688606', #
      '688656', 
      '688658', 
      '688670',
      '688687', 
#      '688767', #
      '688799']
    
##################################
###1.批量下载PDF网站
from get_html import pl_get_table_see
pl_get_table_see(codes1)
    
##################################
##2.删除无关的网站
from leach import pl_shanchu,pl_filter_nb_10y
pl_shanchu(codes1) 
pl_filter_nb_10y(codes1)
    
##################################
##3.下载年报
from download import prepare_hrefs_years,download_pdfs
for code in codes1:
    fname = f'C:/Users/lenovo/Desktop/{code}.csv'
    df =pd.read_csv(fname)
    n=prepare_hrefs_years(df)
    hrefs=n[0]
    years=n[1]
    download_pdfs(hrefs,code,years)

结果一

步骤一截图

结果一(以688566为例)

步骤一(以688566为例)截图

结果二(以688566为例)

步骤二截图

结果三

步骤三截图

备注一

利用定义的函数从网址获取到下载网址,再对网址进行过滤,接着根据过滤好的网址来下载年报PDF文件。

1.结果一:下载的网址文件。

2.结果一(以688566为例):结果一具体截图以股票688566来展示(由于公司上市时间比较晚,故数据量少)。

3.结果二(以688566为例):过滤后的网址文件

4.结果三:下载好的年报PDF文件

代码二


##4.解析年报
from parse import key,math1,math2,get_subtxt,get_account_data,cov

################4.1提取关键指标
for code in codes1:
    math1(code)
    
###### 只有部分成功——是年份问题
for code in codes2:
    math2(code)
    
#########对其中格式不统一的文件进行处理
#由于 '688799' #特殊
#######2022
filename='C:/Users/lenovo/Desktop/688799_2022.PDF'
doc=fitz.Document(filename)
txt = get_subtxt(doc)

revenue=get_account_data('营业收入', txt)  #txt在后面
profit_shlder=get_account_data('\n*'.join('归属于上市公司股东的净利润'), txt)

revenue=cov(revenue)
profit_shlder=cov(profit_shlder)

dic={'2022': [revenue,profit_shlder]}  #列表
sta1=pd.DataFrame(dic,index=['营业收入','归属于上市公司股东的净利润'])

#######2021
filename='C:/Users/lenovo/Desktop/688799_2021.PDF'
doc=fitz.Document(filename)
txt = get_subtxt(doc)

revenue=get_account_data('营业收入', txt)  #txt在后面
profit_shlder=get_account_data('\n*'.join('归属于上市公司股东的净'), txt)

revenue=cov(revenue)
profit_shlder=cov(profit_shlder)

dic={'2021': [revenue,profit_shlder]}  #列表
sta2=pd.DataFrame(dic,index=['营业收入','归属于上市公司股东的净利润'])

f688799=pd.concat([sta1,sta2],axis=1)
filename=f'C:/Users/lenovo/Desktop/688799_数据.csv'
f688799.to_csv(filename)

################4.2提取关键信息
#########对其中格式不统一的文件进行处理

##对688606
filename='C:/Users/lenovo/Desktop/688606_2022.PDF'
doc=fitz.Document(filename)
txtkey1 = get_subtxt(doc,bounds=('公司基本情况','联系人和联系方式'))
subtext=txtkey1

s1= subtext.find('公司办公地址')
s2= subtext.find('公司办公地址的邮政编码')
s3= subtext.find('公司网址')
s4= subtext.find('电子信箱')
s5= subtext.find('二、')
s6= subtext.find('\n董事会秘书')
s7= subtext.find('姓名')
s8= subtext.find('联系地址')
s9= subtext.find('电子信箱')
s10= subtext.find('三、信息披露及备置地点')

L1=subtext[s1:s5]
d1=L1.split()
L2=subtext[s6:s10]  ##字符串
L2=cov(L2)
d2=L2.split() ##列表

c={'公司代码': '688799'}
i = 0
address1=['公司办公地址', '公司网址', '电子信箱']
for index1 in  address1:
    i=i+1
    address_index = d1.index(index1) # 找到对应的索引
    next_row = d1[address_index + 1] # 提取对应索引的下一行内容
    if i == 1:
        c1={'公司办公地址': next_row}
    elif i == 2:
        c2={'公司网址': next_row}
    else:
        c3={'公司电子信箱': next_row}

address2=['姓名', '电话', '电子信箱']
j=0
for index2 in  address2:
    j=j+1
    address_index = d2.index(index2) # 找到对应的索引
    next_row = d2[address_index + 1] # 提取对应索引的下一行内容
    if j == 1:
        g1={'董秘姓名': next_row}
    elif j == 2:
        g2={'董秘电话': next_row}
    else:
        g3={'董秘电子信箱': next_row}

c.update(c1)
c.update(c2)
c.update(c3)   
g1.update(g2)
g1.update(g3) 
c.update(g1) 
need1=c  #字典

##对688767
filename='C:/Users/lenovo/Desktop/688767_2022.PDF'
doc=fitz.Document(filename)
subtext = get_subtxt(doc,bounds=('公司基本情况','联系人和联系方式'))

s1= subtext.find('公司办公地址')
s2= subtext.find('公司办公地址的邮政编码')
s3= subtext.find('公司网址')
s4= subtext.find('电子信箱')
s5= subtext.find('三、')
s6= subtext.find('\n董事会秘书')
s7= subtext.find('姓名')
s8= subtext.find('联系地址')
s9= subtext.find('电话')
s10= subtext.find('电子信箱')
s11= subtext.find('四')

L1=subtext[s1:s5]
d1=L1.split()
L2=subtext[s6:s11]  ##字符串
L2=L2.replace("义\n路", "义路")
d2=L2.split() ##列表

c={'公司代码': '688767'}
i = 0
address1=['公司办公地址', '公司网址', '电子信箱']
for index1 in  address1:
    i=i+1
    address_index = d1.index(index1) # 找到对应的索引
    next_row = d1[address_index + 1] # 提取对应索引的下一行内容
    if i == 1:
        c1={'公司办公地址': next_row}
    elif i == 2:
        c2={'公司网址': next_row}
    else:
        c3={'公司电子信箱': next_row}

address2=['姓名', '电话', '电子信箱']
j=0
for index2 in  address2:
    j=j+1
    address_index = d2.index(index2) # 找到对应的索引
    next_row = d2[address_index + 1] # 提取对应索引的下一行内容
    if j == 1:
        g1={'董秘姓名': next_row}
    elif j == 2:
        g2={'董秘电话': next_row}
    else:
        g3={'董秘电子信箱': next_row}

c.update(c1)
c.update(c2)
c.update(c3)   
g1.update(g2)
g1.update(g3) 
c.update(g1) 
need2=c  #字典

#####合并并保存数据
df = pd.DataFrame()
for code in codes3:
    df = df.append(key(code),ignore_index=True)
df = df.append(need1,ignore_index=True)
df = df.append(need2,ignore_index=True)
print(df)
df.to_csv('C:/Users/lenovo/Desktop/10家公司的信息.csv')    

结果四

步骤四截图

结果四(以股票688566为例)

步骤四截图

结果五

步骤四截图

备注二

1.结果四:利用定义的函数对年报数据进行解析,从中提取关键指标:营业收入和归属于上市公司股东的净利润,并对其中格式特殊的,进行单独处理。

2.结果四(以股票688566为例):结果具体截图以股票688566来展示(由于公司上市时间比较晚,故数据量少)。

3.结果五:利用定义的函数对年报数据进行解析,从中提取关键信息:公司网址、办公地址、电子信箱、董秘的姓名以及董秘的电话号码和董秘的电子信箱信息。

代码三


##5.画图
from draw import con
con(codes1)

#导入数据 
df=pd.read_csv('C:/Users/lenovo/Desktop/十支股票的营业收入(改数据类型).csv',header=0)
df=df.fillna(0) 
df.rename(columns={'Unnamed: 0': '年份'}, inplace=True)
df=df.set_index('年份')

#数据可视化——时间序列图
df.plot(figsize=(20,10))
plt.xlabel(u'日期',fontsize=18)
plt.ylabel(u'营业收入(元)',fontsize=18)
plt.xticks(fontsize=18)
plt.yticks(fontsize=18)
plt.title(u'十支股票营业收入的时间序列图',fontsize=18)
plt.grid()
plt.legend(loc=1,fontsize=10)
plt.show()

### 选688799画营业收入和归属于上市公司股东的净利润
file=pd.read_csv('C:/Users/lenovo/Desktop/688799_数据.csv')
t1=file.iloc[0,1:].rename('营业收入', inplace = True)
t2=file.iloc[1,1:].rename('归属于上市公司股东的净利润', inplace = True)
t=pd.concat([t1,t2],axis=1).reset_index()
t.rename(columns={'index': '年份'}, inplace=True)
t=t.set_index('年份')
t=t.reindex(['2021','2022'])

#数据可视化——时间序列图
t=t.astype('float64')
t.plot(kind='line',subplots=True,sharey=False,figsize=(16,10),title=u'688799营业收入和归属于上市公司股东的净利润的时间序列图',grid=True,fontsize=13)


结果六

步骤五截图

结果七

步骤五截图

备注三

1.结果六:将10家公司的营业收入十年的数据进行展示(由于公司上市时间比较晚,故数据量少)。

2.结果七:选一家公司(这里用的是688799)将其营业收入、归属于上市公司股东的净利润的十年时间序列数据(由于公司上市时间比较晚,故只有两年数据)用折线图展示。

代码四:总代码(缺失运行代码)


##################################################1.获取网页代码
# 从上海证券提取网页
def get_table_see(code):
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.common.action_chains import ActionChains
    from selenium.webdriver.support import expected_conditions
    from selenium.webdriver.support.wait import WebDriverWait
    from selenium.webdriver.common.keys import Keys
    from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
    import time

    browser = webdriver.Chrome()

    browser.get("http://www.sse.com.cn/disclosure/listedinfo/regular/") #从上海证券交易所获取文件
    browser.set_window_size(1550, 830)
    browser.find_element(By.ID, "inputCode").click()
    browser.find_element(By.ID, "inputCode").send_keys(code)  #可改

    time.sleep(5)

    browser.find_element(By.CSS_SELECTOR, ".sse_outerItem:nth-child(4) .filter-option-inner-inner").click()
    browser.find_element(By.LINK_TEXT, "年报").click()

    time.sleep(5)

    css_selector = "body > div.container.sse_content > div > div.col-lg-9.col-xxl-10 > div > div.sse_colContent.js_regular > div.table-responsive > table"
    element = browser.find_element(By.CSS_SELECTOR, css_selector)
    table_html = element.get_attribute('innerHTML')

    f = open('C:/Users/lenovo/Desktop/table.html','w',encoding='utf-8') #改名称
    f.write(table_html)
    f.close()
    ###
    import re
    import pandas as pd

    def get_data(tr):
        p_td = re.compile('(.*?)', re.DOTALL)
        tds = p_td.findall(tr)
        #
        s = tds[0].find('>') + 1
        e = tds[0].rfind('<')
        code = tds[0][s:e]
        #
        s = tds[1].find('>') + 1
        e = tds[1].rfind('<')
        name = tds[1][s:e]
        #
        s = tds[2].find('href="') + 6
        e = tds[2].find('.pdf"') + 4
        href = 'http://www.sse.com.cn' + tds[2][s:e]
        s = tds[2].find('$(this))">') + 10
        e = tds[2].find('')
        title = tds[2][s:e]
        #
        date = tds[3].strip()
        
        data = [code,name,href,title,date]
        return(data)

    # data = get_data(trs_new[1])

    def parse_table(table_html):
        p = re.compile('(.+?)', re.DOTALL)
        trs = p.findall(table_html)
        # 
        trs_new = []
        for tr in trs:
            if tr.strip() != '':
                trs_new.append(tr)
        # 
        data_all = [get_data(tr) for tr in trs_new[1:]]
        df = pd.DataFrame({
            'code': [d[0] for d in data_all],
            'name': [d[1] for d in data_all],
            'href': [d[2] for d in data_all],
            'title': [d[3] for d in data_all],
            'date': [d[4] for d in data_all]
            })
        return(df)

    # f = open('table.html', encoding='utf-8')
    f = open('C:/Users/lenovo/Desktop/table.html', encoding='utf-8') #该名称
    html = f.read()
    f.close()

    # fname = f'{code}.html'
    fname = f'C:/Users/lenovo/Desktop/{code}.csv'
    df = parse_table(html)
    df.to_csv(fname) #改名称
    # df.to_csv('C:/Users/lenovo/Desktop/00000.csv') #改名称
    ####
    import os
    if os.path.exists("C:/Users/lenovo/Desktop/table.html"):
      os.remove("C:/Users/lenovo/Desktop/table.html")
    else:
      print("The file does not exist")     

###批量下载PDF网站
def pl_get_table_see(codes):
    for code in codes:
        get_table_see(code)
        
        
#################################################2.过滤删除无关的网站

import re 
import pandas as pd

def filter_links(words,df,include=True):
    ls=[]
    for word in words:
        if include:
            #ls.append([word in f for f in df.f_name])
            ls.append([word in f for f in df['title']])
        else:
            #ls.append([word not in f for f in df.f_name])
            ls.append([word not in f for f in df['title']])
    index=[]
    for r in range(len(df)):
        flag = not include
        for c in range(len(words)):
            if include:
                flag = flag or ls[c][r]
            else:
                flag = flag and ls[c][r]
        index.append(flag)
    df2=df[index]
    return(df2)

def shanchu(df):
    df_all1 = filter_links(['年年度报告'], df,include=True) #保留title列中,包含“年年度报告”的行
    df_need = filter_links(['摘要'], df_all1,include=False)#删去title列中,包含“摘要”的行
    df = filter_links(['修订'], df_need,include=False)
    return df

###定义批量删除无关网站的函数
def pl_shanchu(codes):
    for code in codes:
        fname = f'C:/Users/lenovo/Desktop/{code}.csv'
        df =pd.read_csv(fname)
        df_need=shanchu(df)
        df_need.to_csv(fname) #改名称 

###########筛选时间
def filter_date(start,end,df):
    date = df['date']
    v=[d>=start and d <= end for d in date]
    df_new=df[v]
    return(df_new)

import datetime
def start_end_10y(): 
    dt_now = datetime.datetime.now()
    current_year = dt_now.year
    start = f'{-9}-01-01'
    end = f'{current_year}-12-31'
    return((start,end))

def filter_nb_10y(df,
                  keep_words=['年报','年度报告'],
                  exclude_words=['摘要'],
                  start=''):
    if start =='':
        start,end = start_end_10y()
    else:
        start_y = int(start[0:4])
        end = f'{start_y + 9}-12-31'
    #
    df= filter_links(keep_words, df,include=True)
    df= filter_links(exclude_words, df,include=False)
    df= filter_date(start, end, df)
    return(df)

#提取出链接、年份    
def prepare_hrefs_years(df):
    hrefs = df['href'].to_list()
    years = [int(d[0:4])-1 for d in df['date']]
    return ((hrefs,years))

#############
###批量处理年份
def pl_filter_nb_10y(codes):
    for code in codes:
        fname = f'C:/Users/lenovo/Desktop/{code}.csv'
        df =pd.read_csv(fname)
        df_fixd=filter_nb_10y(df)
        df_fixd.to_csv(fname)

#################################################3.下载年报
##下载不同年份的年报
###################

import requests

def download_pdf(href,code,year):
    '''
    下载单份年报,自动命名保持
    
    :param href:download link address
    :type string:str
    :param code:证券代码
    :type string:str
    :param year:年报年份
    :type string:str
    
    :return: None
    :rtype: None
    
    '''
    r=requests.get(href, allow_redirects=True)
    fname = f'C:/Users/lenovo/Desktop/{code}_{year}.pdf'  ###指定文件名和路径
    f = open(fname,'wb')
    f.write(r.content)
    f.close()
    #
    r.close()

import time
def download_pdfs(hrefs,code,years):
    for i in range(len(hrefs)):
        href = hrefs[i]
        year = years[i]
        download_pdf(href, code, year)
        time.sleep(30)
    return()

def download_pdfs_codes(list_hrefs,codes,list_years):
    for i in range(len(list_hrefs)):
        hrefs = list_hrefs[i]
        years = list_years[i]
        code = codes[i]
        download_pdfs(hrefs, codes, years)
        time.sleep(30)
    return()

####
import pandas as pd
def pl_download_pdfs_codes(codes):
    for code in codes:
        fname = f'C:/Users/lenovo/Desktop/{code}.csv'
        df =pd.read_csv(fname)
        list_hrefs=df['href']
        list_years=df['year']
        for i in range(len(list_hrefs)):
            hrefs = list_hrefs[i]
            years = list_years[i]
            # code = codes[i]
            download_pdfs(hrefs, code, years)
            time.sleep(30)
    return()

def prepare_hrefs_years(df):
    hrefs = df['href'].to_list()
    years = [int(d[0:4])-1 for d in df['date']]
    return ((hrefs,years))

#################################################4.解析年报

import fitz
import re
import pandas as pd
from pprint import pprint
import os

###############################4.1提取关键指标
#找到'主要会计数据和财务指标'所在的页码(该条注释要改)
def get_subtxt(doc,bounds=('主要会计数据和财务指标','总资产')):
    #默认设置为首尾页码
    start_pageno=0
    end_pageno= len(doc) - 1
    #
    lb,ub = bounds #lb:lower bound (下界) 
    #获取左界页码
    for n in range(len(doc)):
        page = doc[n]
        txt = page.get_text()
        if lb in txt:
            start_pageno = n
            break
    #获取右界页码
    for n in range(start_pageno,len(doc)):
        if ub in doc[n].get_text():
            end_pageno = n
            break
    #获取小范围内字符串
    txt=''
    for n in range(start_pageno,end_pageno+1):
        page = doc[n]
        txt += page.get_text()
    return(txt)

#获取‘营业收入’和‘归属于上市公司股\n东的净利润’
def get_account_data(account,txt):
    p_txt='%s\D*?(\d{1,3}(?:,\d{3})*(?:\.\d+)?)' % account   
    #%s是占位符,用‘account’替换,\D是非数字,\d{1,3}是数字1或2或3个,*可重复,?非贪婪,()内是所要的数字,小数点后\d+表示小数点后至少一位数字
    p=re.compile(p_txt)
    matchobj=p.search(txt)
    amt=matchobj.group(1)
    return(amt)

#将获取的数据转换成浮点数
def cov(f):
    f=f.replace(",", "")
    f=float(f)
    return f 

def math1(code):
    stata=pd.DataFrame()
    for i in range(2020,2023): ##可根据已有年报的年份调整
        fname = f'C:/Users/lenovo/Desktop/{code}_{i}.PDF' #?? i
        import os
        if os.path.exists(fname):
            doc=fitz.Document(fname)
            txt = get_subtxt(doc)
            #
            revenue=get_account_data('营业收入', txt)  #txt在后面
            profit_shlder=get_account_data('\n*'.join('归属于上市公司股东的净利润'), txt)
            #
            dic={i: [revenue,profit_shlder]}  #列表
            sta=pd.DataFrame(dic,index=['营业收入','归属于上市公司股东的净利润']) #字典转列表
            stata=pd.concat([stata,sta],axis=1)
            # df.to_csv('C:/Users/lenovo/Desktop/00000.csv') #改名称
        else:
            break
        filename=f'C:/Users/lenovo/Desktop/{code}_数据.csv'
        stata.to_csv(filename) #改名称
    return stata

###### 只有部分成功——可能是年份问题
def math2(code):
    stata=pd.DataFrame()
    for i in range(2021,2023): ##可根据已有年报的年份调整
        fname = f'C:/Users/lenovo/Desktop/{code}_{i}.PDF' #?? i
        import os
        if os.path.exists(fname):
            doc=fitz.Document(fname)
            txt = get_subtxt(doc)
            #
            revenue=get_account_data('营业收入', txt)  #txt在后面
            profit_shlder=get_account_data('\n*'.join('归属于上市公司股东的净利润'), txt)
            #
            dic={i: [revenue,profit_shlder]}  #列表
            sta=pd.DataFrame(dic,index=['营业收入','归属于上市公司股东的净利润'])
            stata=pd.concat([stata,sta],axis=1)
            # df.to_csv('C:/Users/lenovo/Desktop/00000.csv') #改名称
        else:
            break
        filename=f'C:/Users/lenovo/Desktop/{code}_数据.csv'
        stata.to_csv(filename) #改名称
    return stata

#将获取的会计指标的代码封装成函数
def parse_key_fin_data(subtext,keywords):

    ss=[]
    s = 0
    for kw in keywords:
        n = subtext.find(kw,s)
        ss.append(n)
        s = n+len(kw)
    ss.append(len(subtext))
    data =[]
    #
    p = re.compile('\D+\s+\D*')
    p2 = re.compile('\s')
    for n in range(len(ss)-1):
        s=ss[n]
        e=ss[n+1]
        line = subtext[s:e]
        #获取可能换行的账户名称
        matchobj = p.search(line)
        account_name = p2.sub('',matchobj.group())
        #获取三年数据
        amnts = line[matchobj.end():].split()
        #加上账户名称
        amnts.insert(0, account_name)
        # 追加到总数据
        data.append(amnts)
    return(data)

###################
#由于 '688799' #特殊
#######2022
filename='C:/Users/lenovo/Desktop/688799_2022.PDF'
doc=fitz.Document(filename)
txt = get_subtxt(doc)

revenue=get_account_data('营业收入', txt)  #txt在后面
profit_shlder=get_account_data('\n*'.join('归属于上市公司股东的净利润'), txt)

revenue=cov(revenue)
profit_shlder=cov(profit_shlder)

dic={'2022': [revenue,profit_shlder]}  #列表
sta1=pd.DataFrame(dic,index=['营业收入','归属于上市公司股东的净利润'])

#######2021
filename='C:/Users/lenovo/Desktop/688799_2021.PDF'
doc=fitz.Document(filename)
txt = get_subtxt(doc)

revenue=get_account_data('营业收入', txt)  #txt在后面
profit_shlder=get_account_data('\n*'.join('归属于上市公司股东的净'), txt)

revenue=cov(revenue)
profit_shlder=cov(profit_shlder)

dic={'2021': [revenue,profit_shlder]}  #列表
sta2=pd.DataFrame(dic,index=['营业收入','归属于上市公司股东的净利润'])

f688799=pd.concat([sta1,sta2],axis=1)
filename=f'C:/Users/lenovo/Desktop/688799_数据.csv'
f688799.to_csv(filename)

###############################4.2提取关键信息
##提取关键字
import fitz
import re
import pandas as pd
from pprint import pprint
import os

#找到'主要会计数据和财务指标'所在的页码(该条注释要改)
def get_subtxt(doc,bounds=('主要会计数据和财务指标','总资产')):
    #默认设置为首尾页码
    start_pageno=0
    end_pageno= len(doc) - 1
    #
    lb,ub = bounds #lb:lower bound (下界) 
    #获取左界页码
    for n in range(len(doc)):
        page = doc[n]
        txt = page.get_text()
        if lb in txt:
            start_pageno = n
            break
    #获取右界页码
    for n in range(start_pageno,len(doc)):
        if ub in doc[n].get_text():
            end_pageno = n
            break
    #获取小范围内字符串
    txt=''
    for n in range(start_pageno,end_pageno+1):
        page = doc[n]
        txt += page.get_text()
    return(txt)

def key(code):
    filename=f'C:/Users/lenovo/Desktop/{code}_2022.PDF'
    doc=fitz.Document(filename)
    txtkey = get_subtxt(doc,bounds=('公司基本情况','联系人和联系方式'))
    ##切分所需内容
    subtext=txtkey

    s1= subtext.find('公司办公地址')
    s2= subtext.find('公司办公地址的邮政编码')
    s3= subtext.find('公司网址')
    s4= subtext.find('电子信箱')
    s5= subtext.find('二、')

    L1=subtext[s1:s5]
    d1=L1.split()

    s6= subtext.find('董事会秘书')
    s7= subtext.find('姓名')
    s8= subtext.find('联系')
    s9= subtext.find('电话')
    s10= subtext.find('电子信箱')
    s11= subtext.find('三')

    L2=subtext[s6:s11]  ##字符串
    d2=L2.split() ##列表

    c={'公司代码': code}  
    i = 0
    address1=['公司办公地址', '公司网址', '电子信箱']
    for index1 in  address1:
        i=i+1
        address_index = d1.index(index1) # 找到对应的索引
        next_row = d1[address_index + 1] # 提取对应索引的下一行内容
        if i == 1:
            c1={'公司办公地址': next_row}
        elif i == 2:
            c2={'公司网址': next_row}
        else:
            c3={'公司电子信箱': next_row}

    address2=['姓名', '电话', '电子信箱']
    j=0
    for index2 in  address2:
        j=j+1
        address_index = d2.index(index2) # 找到对应的索引
        next_row = d2[address_index + 1] # 提取对应索引的下一行内容
        if j == 1:
            g1={'董秘姓名': next_row}
        elif j == 2:
            g2={'董秘电话': next_row}
        else:
            g3={'董秘电子信箱': next_row}

    c.update(c1)
    c.update(c2)
    c.update(c3)   
    g1.update(g2)
    g1.update(g3) 
    c.update(g1) 
    need=c  #字典
    return (c)

#########对其中格式不统一的文件进行处理
codes=['688606',
       '688767'] ##格式不一样的文件

#将获取的数据中不必要的空格去了
def cov(f):
    f=f.replace(" ", "")
    return f 

##对688606
filename='C:/Users/lenovo/Desktop/688606_2022.PDF'
doc=fitz.Document(filename)
txtkey1 = get_subtxt(doc,bounds=('公司基本情况','联系人和联系方式'))
subtext=txtkey1

s1= subtext.find('公司办公地址')
s2= subtext.find('公司办公地址的邮政编码')
s3= subtext.find('公司网址')
s4= subtext.find('电子信箱')
s5= subtext.find('二、')
s6= subtext.find('\n董事会秘书')
s7= subtext.find('姓名')
s8= subtext.find('联系地址')
s9= subtext.find('电子信箱')
s10= subtext.find('三、信息披露及备置地点')

L1=subtext[s1:s5]
d1=L1.split()
L2=subtext[s6:s10]  ##字符串
L2=cov(L2)
d2=L2.split() ##列表

c={'公司代码': '688799'}
i = 0
address1=['公司办公地址', '公司网址', '电子信箱']
for index1 in  address1:
    i=i+1
    address_index = d1.index(index1) # 找到对应的索引
    next_row = d1[address_index + 1] # 提取对应索引的下一行内容
    if i == 1:
        c1={'公司办公地址': next_row}
    elif i == 2:
        c2={'公司网址': next_row}
    else:
        c3={'公司电子信箱': next_row}

address2=['姓名', '电话', '电子信箱']
j=0
for index2 in  address2:
    j=j+1
    address_index = d2.index(index2) # 找到对应的索引
    next_row = d2[address_index + 1] # 提取对应索引的下一行内容
    if j == 1:
        g1={'董秘姓名': next_row}
    elif j == 2:
        g2={'董秘电话': next_row}
    else:
        g3={'董秘电子信箱': next_row}

c.update(c1)
c.update(c2)
c.update(c3)   
g1.update(g2)
g1.update(g3) 
c.update(g1) 
need1=c  #字典

##对688767
filename='C:/Users/lenovo/Desktop/688767_2022.PDF'
doc=fitz.Document(filename)
subtext = get_subtxt(doc,bounds=('公司基本情况','联系人和联系方式'))

s1= subtext.find('公司办公地址')
s2= subtext.find('公司办公地址的邮政编码')
s3= subtext.find('公司网址')
s4= subtext.find('电子信箱')
s5= subtext.find('三、')
s6= subtext.find('\n董事会秘书')
s7= subtext.find('姓名')
s8= subtext.find('联系地址')
s9= subtext.find('电话')
s10= subtext.find('电子信箱')
s11= subtext.find('四')

L1=subtext[s1:s5]
d1=L1.split()
L2=subtext[s6:s11]  ##字符串
L2=L2.replace("义\n路", "义路")
d2=L2.split() ##列表

c={'公司代码': '688767'}
i = 0
address1=['公司办公地址', '公司网址', '电子信箱']
for index1 in  address1:
    i=i+1
    address_index = d1.index(index1) # 找到对应的索引
    next_row = d1[address_index + 1] # 提取对应索引的下一行内容
    if i == 1:
        c1={'公司办公地址': next_row}
    elif i == 2:
        c2={'公司网址': next_row}
    else:
        c3={'公司电子信箱': next_row}

address2=['姓名', '电话', '电子信箱']
j=0
for index2 in  address2:
    j=j+1
    address_index = d2.index(index2) # 找到对应的索引
    next_row = d2[address_index + 1] # 提取对应索引的下一行内容
    if j == 1:
        g1={'董秘姓名': next_row}
    elif j == 2:
        g2={'董秘电话': next_row}
    else:
        g3={'董秘电子信箱': next_row}

c.update(c1)
c.update(c2)
c.update(c3)   
g1.update(g2)
g1.update(g3) 
c.update(g1) 
need2=c  #字典

#################################################5.画图
mport pandas as pd
import numpy as np
#import seaborn as sns
import matplotlib.pyplot as plt
from pylab import mpl
import datetime
#from pylab import plt, mpl
#plt.style.use('seaborn')###设置画图风格
mpl.rcParams['font.sans-serif']=['FangSong']
mpl.rcParams['axes.unicode_minus']=False
from pandas.plotting import register_matplotlib_converters
register_matplotlib_converters()

##提取营业收入,并合并合并十支股票的营业收入
def con(codes):
    stata=pd.DataFrame()
    for code in codes:
        fname=f'C:/Users/lenovo/Desktop/{code}_数据.csv'  #导入数据 
        df=pd.read_csv(fname,header=0)
        m=df.iloc[0,1:].rename(code, inplace = True)
        stata=pd.concat([stata,m],axis=1)
    filename=f'C:/Users/lenovo/Desktop/十支股票的营业收入.csv'
    stata.to_csv(filename)

#导入数据 
df=pd.read_csv('C:/Users/lenovo/Desktop/十支股票的营业收入(改数据类型).csv',header=0)
df=df.fillna(0) 
df.rename(columns={'Unnamed: 0': '年份'}, inplace=True)
df=df.set_index('年份')

#数据可视化——时间序列图
df.plot(figsize=(20,10))
plt.xlabel(u'日期',fontsize=18)
plt.ylabel(u'营业收入(元)',fontsize=18)
plt.xticks(fontsize=18)
plt.yticks(fontsize=18)
plt.title(u'十支股票营业收入的时间序列图',fontsize=18)
plt.grid()
plt.legend(loc=1,fontsize=10)
plt.show()

### 选688799画营业收入和归属于上市公司股东的净利润
file=pd.read_csv('C:/Users/lenovo/Desktop/688799_数据.csv')
t1=file.iloc[0,1:].rename('营业收入', inplace = True)
t2=file.iloc[1,1:].rename('归属于上市公司股东的净利润', inplace = True)
t=pd.concat([t1,t2],axis=1).reset_index()
t.rename(columns={'index': '年份'}, inplace=True)
t=t.set_index('年份')
t=t.reindex(['2021','2022'])

#数据可视化——时间序列图
t=t.astype('float64')
t.plot(kind='line',subplots=True,sharey=False,figsize=(16,10),title=u'688799营业收入和归属于上市公司股东的净利润的时间序列图',grid=True,fontsize=13)