In [16]:
import pandas as pd
import numpy as np
import openpyxl
import re
import requests
import time
import os
import fitz
In [17]:
xlsx = '半导体行业.xlsx'
df = pd.read_excel(xlsx)
exf = openpyxl.load_workbook(xlsx)
sheet = exf.active
C2 = sheet['C2']
C = sheet['C']
links = [c.value for c in C]
links_1 = links[1:-1]
links_2 = ''.join(links_1)

p = re.compile('"(.*?)","(.*?)"')
list_of_tuple = p.findall(links_2)

df1 = pd.DataFrame({'Link': [t[0] for t in list_of_tuple],
                    'f_name': [t[1] for t in list_of_tuple]})
df1.to_excel('半导体行业_final.xlsx')
print(df1.head(10))
                                                Link                 f_name
0  http://news.windin.com/ns/bulletin.php?code=35...     寒武纪:2020年年度报告(修订版)
1  http://news.windin.com/ns/bulletin.php?code=EF...  敏芯股份:2020年年度报告全文(修订版)
2  http://news.windin.com/ns/bulletin.php?code=1B...        华润微:2020年年度报告摘要
3  http://news.windin.com/ns/bulletin.php?code=F9...          华润微:2020年年度报告
4  http://news.windin.com/ns/bulletin.php?code=13...         澜起科技:2020年年度报告
5  http://news.windin.com/ns/bulletin.php?code=0C...       澜起科技:2020年年度报告摘要
6  http://news.windin.com/ns/bulletin.php?code=D1...        *ST盈方:2020年年度报告
7  http://news.windin.com/ns/bulletin.php?code=D6...      *ST盈方:2020年年度报告摘要
8  http://news.windin.com/ns/bulletin.php?code=94...          富瀚微:2020年年度报告
9  http://news.windin.com/ns/bulletin.php?code=7E...        富瀚微:2020年年度报告摘要
In [18]:
df2=pd.read_excel(r'C:\Users\pc\Desktop\梅峻滔\半导体行业_final.xlsx')
links=df2['Link'];f_names=df1['f_name']
p=re.compile('(?<=\d{4})(年报)|(年年报)')
f_names=[p.sub('年年度报告',f) for f in df2.f_name]
df2['f_name']=f_names;del p,f_names
print(df2)
     Unnamed: 0                                               Link  \
0             0  http://news.windin.com/ns/bulletin.php?code=35...   
1             1  http://news.windin.com/ns/bulletin.php?code=EF...   
2             2  http://news.windin.com/ns/bulletin.php?code=1B...   
3             3  http://news.windin.com/ns/bulletin.php?code=F9...   
4             4  http://news.windin.com/ns/bulletin.php?code=13...   
..          ...                                                ...   
495         495  http://news.windin.com/ns/bulletin.php?code=27...   
496         496  http://news.windin.com/ns/bulletin.php?code=d1...   
497         497  http://news.windin.com/ns/bulletin.php?code=c3...   
498         498  http://news.windin.com/ns/bulletin.php?code=5b...   
499         499  http://news.windin.com/ns/bulletin.php?code=18...   

                    f_name  
0       寒武纪:2020年年度报告(修订版)  
1    敏芯股份:2020年年度报告全文(修订版)  
2          华润微:2020年年度报告摘要  
3            华润微:2020年年度报告  
4           澜起科技:2020年年度报告  
..                     ...  
495        士兰微:2015年年度报告摘要  
496          士兰微:2015年年度报告  
497         通富微电:2015年年度报告  
498       通富微电:2015年年度报告摘要  
499         苏州固锝:2015年年度报告  

[500 rows x 3 columns]
In [19]:
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])
        else:
            ls.append([word not in f for f in df.f_name])
    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)
    df3 = df[index]
    return(df3)
In [20]:
df_all=filter_links(['摘要','问询函','社会责任','审计','财务','风险','债券'],df1,include=False)
df_orig=filter_links(['(','(',],df_all,include=False)
df_updt=filter_links(['(','(',],df_all,include=True)
df_updt=filter_links(['取消'],df_updt,include=False)
print(df_orig,df_updt)
                                                  Link           f_name
3    http://news.windin.com/ns/bulletin.php?code=F9...    华润微:2020年年度报告
4    http://news.windin.com/ns/bulletin.php?code=13...   澜起科技:2020年年度报告
6    http://news.windin.com/ns/bulletin.php?code=D1...  *ST盈方:2020年年度报告
8    http://news.windin.com/ns/bulletin.php?code=94...    富瀚微:2020年年度报告
10   http://news.windin.com/ns/bulletin.php?code=5E...    博通集成:2020年度报告
..                                                 ...              ...
491  http://news.windin.com/ns/bulletin.php?code=1d...   聚飞光电:2015年年度报告
493  http://news.windin.com/ns/bulletin.php?code=c8...   台基股份:2015年年度报告
496  http://news.windin.com/ns/bulletin.php?code=d1...      士兰微:2015年年报
497  http://news.windin.com/ns/bulletin.php?code=c3...   通富微电:2015年年度报告
499  http://news.windin.com/ns/bulletin.php?code=18...   苏州固锝:2015年年度报告

[233 rows x 2 columns]                                                   Link                 f_name
0    http://news.windin.com/ns/bulletin.php?code=35...     寒武纪:2020年年度报告(修订版)
1    http://news.windin.com/ns/bulletin.php?code=EF...  敏芯股份:2020年年度报告全文(修订版)
19   http://news.windin.com/ns/bulletin.php?code=5C...    晓程科技:2019年年度报告(更新后)
56   http://news.windin.com/ns/bulletin.php?code=78...    惠伦晶体:2020年年度报告(更新后)
64   http://news.windin.com/ns/bulletin.php?code=29...     力合微:2020年年度报告(更新后)
77   http://news.windin.com/ns/bulletin.php?code=FD...    芯原股份:2020年年度报告(修订版)
135  http://news.windin.com/ns/bulletin.php?code=08...    泰晶科技:2020年年度报告(更正版)
152  http://news.windin.com/ns/bulletin.php?code=0D...     富瀚微:2018年年度报告(更新后)
153  http://news.windin.com/ns/bulletin.php?code=0D...     富瀚微:2017年年度报告(更新后)
154  http://news.windin.com/ns/bulletin.php?code=07...     富瀚微:2019年年度报告(更新后)
156  http://news.windin.com/ns/bulletin.php?code=AE...    捷捷微电:2019年年度报告(更新后)
157  http://news.windin.com/ns/bulletin.php?code=3B...     欧比特:2019年年度报告(更新后)
225  http://news.windin.com/ns/bulletin.php?code=31...     阿石创:2019年年度报告(更新后)
267  http://news.windin.com/ns/bulletin.php?code=28...    新亚制程:2018年年度报告(更新后)
268  http://news.windin.com/ns/bulletin.php?code=3D...    弘高创意:2018年年度报告(更新后)
308  http://news.windin.com/ns/bulletin.php?code=14...    联建光电:2017年年度报告(更新后)
309  http://news.windin.com/ns/bulletin.php?code=47...     盈方微:2017年年度报告(更新后)
310  http://news.windin.com/ns/bulletin.php?code=18...   *ST海润:2017年年度报告(修订版)
311  http://news.windin.com/ns/bulletin.php?code=04...    长电科技:2017年年度报告(修订版)
312  http://news.windin.com/ns/bulletin.php?code=2E...    三安光电:2017年年度报告(修订稿)
353  http://news.windin.com/ns/bulletin.php?code=9A...    华微电子:2017年年度报告(修订版)
390  http://news.windin.com/ns/bulletin.php?code=FB...   *ST弘高:2016年年度报告(更新后)
392  http://news.windin.com/ns/bulletin.php?code=45...   *ST海润:2016年年度报告(修订版)
394  http://news.windin.com/ns/bulletin.php?code=9C...    联建光电:2016年年度报告(更新后)
434  http://news.windin.com/ns/bulletin.php?code=FD...   *ST盈方:2016年年度报告(更新后)
459  http://news.windin.com/ns/bulletin.php?code=F0...    弘高创意:2015年年度报告(更新后)
460  http://news.windin.com/ns/bulletin.php?code=AA...   *ST盈方:2015年年度报告(更新后)
In [21]:
def sub_with_update(df_updt,df_orig):
    index_orig=[];i=0
    index_updt=[];j=0
    for i,f in enumerate(df_orig):
        for j,fn in enumerate(df_updt):
            if f in fn:
                index_orig.append(i)
                index_updt.append(j)
    for n in range(len(index_orig)):
        i=index_orig[n]
        j=index_updt[n]
        df_orig.iloc[i,-2]=df_updt.iloc[j,-2]
    return(df_orig)

df_newest=sub_with_update(df_updt,df_orig)

df_newest.sort_values(by=['f_name'],inplace=True,ignore_index=True)
print(df_newest)
                                                  Link            f_name
0    http://news.windin.com/ns/bulletin.php?code=8A...   *ST弘高:2017年年度报告
1    http://news.windin.com/ns/bulletin.php?code=9f...   *ST海润:2015年年度报告
2    http://news.windin.com/ns/bulletin.php?code=19...   *ST海润:2017年年度报告
3    http://news.windin.com/ns/bulletin.php?code=5E...   *ST盈方:2016年年度报告
4    http://news.windin.com/ns/bulletin.php?code=F9...   *ST盈方:2019年年度报告
..                                                 ...               ...
228  http://news.windin.com/ns/bulletin.php?code=16...     阿石创:2019年年度报告
229  http://news.windin.com/ns/bulletin.php?code=D5...     阿石创:2020年年度报告
230  http://news.windin.com/ns/bulletin.php?code=26...    雅克科技:2020年年度报告
231  http://news.windin.com/ns/bulletin.php?code=A4...    韦尔股份:2019年年度报告
232  http://news.windin.com/ns/bulletin.php?code=04...  韦尔股份:2020年年度报告全文

[233 rows x 2 columns]
D:\anaconda\lib\site-packages\pandas\core\indexing.py:670: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  iloc._setitem_with_indexer(indexer, value)

D:\anaconda\lib\site-packages\ipykernel_launcher.py:12: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  if sys.path[0] == '':

D:\anaconda\lib\site-packages\ipykernel_launcher.py:17: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy

In [22]:
df_newest['公司简称']=[f[:4] for f in df_newest.f_name]
counts=df_newest['公司简称'].value_counts()
ten_company=[]
for cn in counts.index[:10]:
    ten_company.append(filter_links([cn],df_newest))
print(ten_company)
[                                                  Link          f_name  公司简称
211  http://news.windin.com/ns/bulletin.php?code=c3...  通富微电:2015年年度报告  通富微电
212  http://news.windin.com/ns/bulletin.php?code=CA...  通富微电:2016年年度报告  通富微电
213  http://news.windin.com/ns/bulletin.php?code=DC...  通富微电:2017年年度报告  通富微电
214  http://news.windin.com/ns/bulletin.php?code=4A...  通富微电:2018年年度报告  通富微电
215  http://news.windin.com/ns/bulletin.php?code=53...  通富微电:2019年年度报告  通富微电
216  http://news.windin.com/ns/bulletin.php?code=02...  通富微电:2020年年度报告  通富微电,                                                  Link          f_name  公司简称
60  http://news.windin.com/ns/bulletin.php?code=1b...  南大光电:2015年年度报告  南大光电
61  http://news.windin.com/ns/bulletin.php?code=30...  南大光电:2016年年度报告  南大光电
62  http://news.windin.com/ns/bulletin.php?code=6B...  南大光电:2017年年度报告  南大光电
63  http://news.windin.com/ns/bulletin.php?code=E4...  南大光电:2018年年度报告  南大光电
64  http://news.windin.com/ns/bulletin.php?code=09...  南大光电:2019年年度报告  南大光电
65  http://news.windin.com/ns/bulletin.php?code=FB...  南大光电:2020年年度报告  南大光电,                                                  Link         f_name  公司简称
86  http://news.windin.com/ns/bulletin.php?code=d1...    士兰微:2015年年报  士兰微:
87  http://news.windin.com/ns/bulletin.php?code=BE...  士兰微:2016年年度报告  士兰微:
88  http://news.windin.com/ns/bulletin.php?code=F8...  士兰微:2017年年度报告  士兰微:
89  http://news.windin.com/ns/bulletin.php?code=0E...  士兰微:2018年年度报告  士兰微:
90  http://news.windin.com/ns/bulletin.php?code=9A...  士兰微:2019年年度报告  士兰微:
91  http://news.windin.com/ns/bulletin.php?code=B1...  士兰微:2020年年度报告  士兰微:,                                                  Link          f_name  公司简称
40  http://news.windin.com/ns/bulletin.php?code=49...  华天科技:2015年年度报告  华天科技
41  http://news.windin.com/ns/bulletin.php?code=A3...  华天科技:2016年年度报告  华天科技
42  http://news.windin.com/ns/bulletin.php?code=72...  华天科技:2017年年度报告  华天科技
43  http://news.windin.com/ns/bulletin.php?code=BC...  华天科技:2018年年度报告  华天科技
44  http://news.windin.com/ns/bulletin.php?code=09...  华天科技:2019年年度报告  华天科技
45  http://news.windin.com/ns/bulletin.php?code=82...  华天科技:2020年年度报告  华天科技,                                                   Link          f_name  公司简称
205  http://news.windin.com/ns/bulletin.php?code=18...  苏州固锝:2015年年度报告  苏州固锝
206  http://news.windin.com/ns/bulletin.php?code=AD...  苏州固锝:2016年年度报告  苏州固锝
207  http://news.windin.com/ns/bulletin.php?code=26...  苏州固锝:2017年年度报告  苏州固锝
208  http://news.windin.com/ns/bulletin.php?code=99...  苏州固锝:2018年年度报告  苏州固锝
209  http://news.windin.com/ns/bulletin.php?code=3D...  苏州固锝:2019年年度报告  苏州固锝
210  http://news.windin.com/ns/bulletin.php?code=68...  苏州固锝:2020年年度报告  苏州固锝,                                                  Link          f_name  公司简称
13  http://news.windin.com/ns/bulletin.php?code=4A...  上海贝岭:2016年年度报告  上海贝岭
14  http://news.windin.com/ns/bulletin.php?code=B7...  上海贝岭:2017年年度报告  上海贝岭
15  http://news.windin.com/ns/bulletin.php?code=3E...  上海贝岭:2018年年度报告  上海贝岭
16  http://news.windin.com/ns/bulletin.php?code=24...  上海贝岭:2019年年度报告  上海贝岭
17  http://news.windin.com/ns/bulletin.php?code=F0...  上海贝岭:2020年年度报告  上海贝岭,                                                   Link          f_name  公司简称
145  http://news.windin.com/ns/bulletin.php?code=BF...  有研新材:2016年年度报告  有研新材
146  http://news.windin.com/ns/bulletin.php?code=C7...  有研新材:2017年年度报告  有研新材
147  http://news.windin.com/ns/bulletin.php?code=50...  有研新材:2018年年度报告  有研新材
148  http://news.windin.com/ns/bulletin.php?code=ED...  有研新材:2019年年度报告  有研新材
149  http://news.windin.com/ns/bulletin.php?code=4E...  有研新材:2020年年度报告  有研新材,                                                   Link          f_name  公司简称
114  http://news.windin.com/ns/bulletin.php?code=62...  惠伦晶体:2015年年度报告  惠伦晶体
115  http://news.windin.com/ns/bulletin.php?code=72...  惠伦晶体:2016年年度报告  惠伦晶体
116  http://news.windin.com/ns/bulletin.php?code=25...  惠伦晶体:2017年年度报告  惠伦晶体
117  http://news.windin.com/ns/bulletin.php?code=BA...  惠伦晶体:2019年年度报告  惠伦晶体
118  http://news.windin.com/ns/bulletin.php?code=C0...  惠伦晶体:2020年年度报告  惠伦晶体,                                                   Link         f_name  公司简称
150  http://news.windin.com/ns/bulletin.php?code=df...  欧比特:2015年年度报告  欧比特:
151  http://news.windin.com/ns/bulletin.php?code=ED...  欧比特:2016年年度报告  欧比特:
152  http://news.windin.com/ns/bulletin.php?code=41...  欧比特:2017年年度报告  欧比特:
153  http://news.windin.com/ns/bulletin.php?code=DF...  欧比特:2019年年度报告  欧比特:
154  http://news.windin.com/ns/bulletin.php?code=31...  欧比特:2020年年度报告  欧比特:,                                                  Link          f_name  公司简称
68  http://news.windin.com/ns/bulletin.php?code=c8...  台基股份:2015年年度报告  台基股份
69  http://news.windin.com/ns/bulletin.php?code=4F...  台基股份:2016年年度报告  台基股份
70  http://news.windin.com/ns/bulletin.php?code=8E...  台基股份:2017年年度报告  台基股份
71  http://news.windin.com/ns/bulletin.php?code=C4...  台基股份:2019年年度报告  台基股份
72  http://news.windin.com/ns/bulletin.php?code=9B...  台基股份:2020年年度报告  台基股份]
D:\anaconda\lib\site-packages\ipykernel_launcher.py:1: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  """Entry point for launching an IPython kernel.

In [25]:
def get_PDF_url(url):
    r=requests.get(url);r.encoding='utf-8';html=r.text
    r.close()
    p=re.compile('<a href=(.*?)\s.*?>(.*?)</a>',re.DOTALL)
    a=p.search(html)
    if a is None:
        Warning('没有找到下载链接,请手动检查链接:%s' % url)
        return()
    else:
        href=a.group(1);fname=a.group(2).strip()
    href=r.url[:26]+href
    return((href,fname))
In [24]:
for n in range(len(ten_company)):
    df_One_Co = pd.DataFrame({'Link':[h for h in ten_company[n]['Link']],
                    'f_name':[f for f in ten_company[n]['f_name']]})
    for i in range(len(df_One_Co)):
        href,fname=get_PDF_url(df_One_Co.Link[i])
        r=requests.get(href,allow_redirects=True)
        open('%s'%fname,'wb').write(r.content)
        time.sleep(10)
    r.close()
In [26]:
filenames = os.listdir()
print(filenames)
['.ipynb_checkpoints', '600171上海贝岭2017年年度报告.pdf', '600171上海贝岭2018年年度报告.pdf', '600171上海贝岭2019年年度报告.pdf', '600171上海贝岭2020年年度报告.pdf', '600171: 上海贝岭2016年年度报告.pdf', '600206有研新材2016年年度报告.pdf', '600206有研新材2017年年度报告.pdf', '600206有研新材2018年年度报告.pdf', '600206有研新材2019年年度报告.pdf', '600206有研新材2020年年度报告.pdf', '600460士兰微2015年年报.pdf', '600460士兰微2016年年度报告.pdf', '600460士兰微2017年年度报告.pdf', '600460士兰微2018年年度报告.pdf', '600460士兰微2019年年度报告.pdf', '600460杭州士兰微电子股份有限公司2020年年度报告.pdf', 'project.ipynb', '半导体行业.xlsx', '半导体行业_final.xlsx', '华天科技:2015年年度报告.pdf', '华天科技:2016年年度报告.pdf', '华天科技:2017年年度报告.pdf', '华天科技:2018年年度报告.pdf', '华天科技:2019年年度报告.pdf', '华天科技:2020年年度报告.pdf', '南大光电:2015年年度报告.pdf', '南大光电:2016年年度报告.pdf', '南大光电:2017年年度报告.pdf', '南大光电:2018年年度报告.pdf', '南大光电:2019年年度报告.pdf', '南大光电:2020年年度报告.pdf', '台基股份:2015年年度报告.pdf', '台基股份:2016年年度报告.pdf', '台基股份:2017年年度报告.pdf', '台基股份:2019年年度报告.pdf', '台基股份:2020年年度报告.pdf', '惠伦晶体:2015年年度报告.pdf', '惠伦晶体:2016年年度报告.pdf', '惠伦晶体:2017年年度报告.pdf', '惠伦晶体:2019年年度报告.pdf', '惠伦晶体:2020年年度报告.pdf', '欧比特:2015年年度报告.pdf', '欧比特:2016年年度报告.pdf', '欧比特:2017年年度报告.pdf', '欧比特:2019年年度报告.pdf', '欧比特:2020年年度报告.pdf', '苏州固锝:2015年年度报告.pdf', '苏州固锝:2016年年度报告.pdf', '苏州固锝:2017年年度报告.pdf', '苏州固锝:2018年年度报告.pdf', '苏州固锝:2019年年度报告.pdf', '苏州固锝:2020年年度报告.pdf', '通富微电:2015年年度报告.pdf', '通富微电:2016年年度报告.pdf', '通富微电:2017年年度报告.pdf', '通富微电:2018年年度报告.pdf', '通富微电:2019年年度报告.pdf', '通富微电:2020年年度报告.pdf']
In [27]:
for i in range(len(ten_company)):
    prefix= ten_company[i].iloc[1,-1]
    print(prefix)
    pdf = [f for f in filenames if prefix[:3] in f and f.endswith('.pdf')]
    print(pdf)
    year = [p[-13:-9] for p in pdf]
    print(year)
    
通富微电
['通富微电:2015年年度报告.pdf', '通富微电:2016年年度报告.pdf', '通富微电:2017年年度报告.pdf', '通富微电:2018年年度报告.pdf', '通富微电:2019年年度报告.pdf', '通富微电:2020年年度报告.pdf']
['2015', '2016', '2017', '2018', '2019', '2020']
南大光电
['南大光电:2015年年度报告.pdf', '南大光电:2016年年度报告.pdf', '南大光电:2017年年度报告.pdf', '南大光电:2018年年度报告.pdf', '南大光电:2019年年度报告.pdf', '南大光电:2020年年度报告.pdf']
['2015', '2016', '2017', '2018', '2019', '2020']
士兰微:
['600460士兰微2015年年报.pdf', '600460士兰微2016年年度报告.pdf', '600460士兰微2017年年度报告.pdf', '600460士兰微2018年年度报告.pdf', '600460士兰微2019年年度报告.pdf', '600460杭州士兰微电子股份有限公司2020年年度报告.pdf']
['兰微20', '2016', '2017', '2018', '2019', '2020']
华天科技
['华天科技:2015年年度报告.pdf', '华天科技:2016年年度报告.pdf', '华天科技:2017年年度报告.pdf', '华天科技:2018年年度报告.pdf', '华天科技:2019年年度报告.pdf', '华天科技:2020年年度报告.pdf']
['2015', '2016', '2017', '2018', '2019', '2020']
苏州固锝
['苏州固锝:2015年年度报告.pdf', '苏州固锝:2016年年度报告.pdf', '苏州固锝:2017年年度报告.pdf', '苏州固锝:2018年年度报告.pdf', '苏州固锝:2019年年度报告.pdf', '苏州固锝:2020年年度报告.pdf']
['2015', '2016', '2017', '2018', '2019', '2020']
上海贝岭
['600171上海贝岭2017年年度报告.pdf', '600171上海贝岭2018年年度报告.pdf', '600171上海贝岭2019年年度报告.pdf', '600171上海贝岭2020年年度报告.pdf', '600171: 上海贝岭2016年年度报告.pdf']
['2017', '2018', '2019', '2020', '2016']
有研新材
['600206有研新材2016年年度报告.pdf', '600206有研新材2017年年度报告.pdf', '600206有研新材2018年年度报告.pdf', '600206有研新材2019年年度报告.pdf', '600206有研新材2020年年度报告.pdf']
['2016', '2017', '2018', '2019', '2020']
惠伦晶体
['惠伦晶体:2015年年度报告.pdf', '惠伦晶体:2016年年度报告.pdf', '惠伦晶体:2017年年度报告.pdf', '惠伦晶体:2019年年度报告.pdf', '惠伦晶体:2020年年度报告.pdf']
['2015', '2016', '2017', '2019', '2020']
欧比特:
['欧比特:2015年年度报告.pdf', '欧比特:2016年年度报告.pdf', '欧比特:2017年年度报告.pdf', '欧比特:2019年年度报告.pdf', '欧比特:2020年年度报告.pdf']
['2015', '2016', '2017', '2019', '2020']
台基股份
['台基股份:2015年年度报告.pdf', '台基股份:2016年年度报告.pdf', '台基股份:2017年年度报告.pdf', '台基股份:2019年年度报告.pdf', '台基股份:2020年年度报告.pdf']
['2015', '2016', '2017', '2019', '2020']
In [28]:
def getText(pdf):
    text = ''
    doc = fitz.open(pdf)
    for page in doc:
        text += page.getText()
    doc.close()
    return(text)
    
def parse_data_line(pdf):    
    text = getText(pdf)
    p1 = re.compile('\w{1,2}、主要会计数据和财务指标(.*?)(?=\w{1,2}、)',re.DOTALL)
    subtext = p1.search(text)
    if subtext is None:
        p1 = re.compile('(\w{1,2})\s*主要会计数据(.*?)(?=(\w{1,2})\s*主要财务指标)',re.DOTALL)
        subtext = p1.search(text).group(0)
    else:
        subtext = p1.search(text).group(0)
    subp='([0-9,.%\- ]*?)\n' and '([0-9,.%\- ]*?)\s'
    psub='%s%s%s%s'%(subp,subp,subp,subp)
    p=re.compile('(\D+\n)+%s'%psub)
    lines=p.findall(subtext)    
    return(lines)
In [48]:
filenames = os.listdir()
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif']=['SimHei']  #确保显示中文
plt.rcParams['axes.unicode_minus'] = False  #确保显示负数的参数设置
In [49]:
for i in range(5):
    prefix= ten_company[-i].iloc[1,-1]
    print(prefix)
    pdf = [f for f in filenames if prefix[:3] in f and f.endswith('.pdf')]
    year = [p[-13:-9] for p in pdf]
    df_data=pd.DataFrame({'年份':year,
                      '年营业收入':''})
    for y in range(len(pdf)):
        lines=parse_data_line(pdf[y])
        df_fnc=pd.DataFrame([l for l in lines],columns=['',year[y]+'年',str(eval(year[y])-1)+'年','本年比上年增减',str(eval(year[y])-2)+'年']) 
        #df_fnc.to_excel('%s%s财务数据.xls'%(prefix,year[y]))
        s=df_fnc.iloc[0,1]
        s=s.replace(',','')
        df_data['年营业收入'][[y]]=eval(s)
    print(df_data)
    plt.figure()
    plt.plot(df_data['年份'],df_data['年营业收入'],label=u'年营业收入',color='#FF8247')
    for x,y in zip(df_data['年份'],df_data['年营业收入']):#显示bar数值
        plt.text(x,y,'%.3e'%y,ha='center',va='bottom')
    plt.xlabel(u'(年)',fontsize=13)
    plt.ylabel(u'年营业收入(元)',fontsize=13,rotation=90)
    plt.legend(loc='best')
    plt.title(u'%s%s-%s年营业收入的可视化'%(prefix,str(year[0]),str(year[-1])),fontsize=13)
    plt.yticks(range(0,10**10,10**9))
    plt.show()
通富微电
     年份        年营业收入
0  2015   2.3219e+09
1  2016  4.59166e+09
2  2017  6.51926e+09
3  2018  7.22286e+09
4  2019  8.26657e+09
5  2020  1.07687e+10
D:\anaconda\lib\site-packages\matplotlib\cbook\__init__.py:2064: FutureWarning: Support for multi-dimensional indexing (e.g. `obj[:, None]`) is deprecated and will be removed in a future version.  Convert to a numpy array before indexing instead.
  x[:, None]

D:\anaconda\lib\site-packages\matplotlib\axes\_base.py:248: FutureWarning: Support for multi-dimensional indexing (e.g. `obj[:, None]`) is deprecated and will be removed in a future version.  Convert to a numpy array before indexing instead.
  x = x[:, np.newaxis]

D:\anaconda\lib\site-packages\matplotlib\axes\_base.py:250: FutureWarning: Support for multi-dimensional indexing (e.g. `obj[:, None]`) is deprecated and will be removed in a future version.  Convert to a numpy array before indexing instead.
  y = y[:, np.newaxis]

台基股份
     年份        年营业收入
0  2015  1.66154e+08
1  2016  2.42092e+08
2  2017  2.78652e+08
3  2019  2.64938e+08
4  2020  3.88245e+08
D:\anaconda\lib\site-packages\matplotlib\cbook\__init__.py:2064: FutureWarning: Support for multi-dimensional indexing (e.g. `obj[:, None]`) is deprecated and will be removed in a future version.  Convert to a numpy array before indexing instead.
  x[:, None]

D:\anaconda\lib\site-packages\matplotlib\axes\_base.py:248: FutureWarning: Support for multi-dimensional indexing (e.g. `obj[:, None]`) is deprecated and will be removed in a future version.  Convert to a numpy array before indexing instead.
  x = x[:, np.newaxis]

D:\anaconda\lib\site-packages\matplotlib\axes\_base.py:250: FutureWarning: Support for multi-dimensional indexing (e.g. `obj[:, None]`) is deprecated and will be removed in a future version.  Convert to a numpy array before indexing instead.
  y = y[:, np.newaxis]

欧比特:
     年份        年营业收入
0  2015  3.88817e+08
1  2016  5.59937e+08
2  2017  7.38851e+08
3  2019  8.51704e+08
4  2020  8.69832e+08
D:\anaconda\lib\site-packages\matplotlib\cbook\__init__.py:2064: FutureWarning: Support for multi-dimensional indexing (e.g. `obj[:, None]`) is deprecated and will be removed in a future version.  Convert to a numpy array before indexing instead.
  x[:, None]

D:\anaconda\lib\site-packages\matplotlib\axes\_base.py:248: FutureWarning: Support for multi-dimensional indexing (e.g. `obj[:, None]`) is deprecated and will be removed in a future version.  Convert to a numpy array before indexing instead.
  x = x[:, np.newaxis]

D:\anaconda\lib\site-packages\matplotlib\axes\_base.py:250: FutureWarning: Support for multi-dimensional indexing (e.g. `obj[:, None]`) is deprecated and will be removed in a future version.  Convert to a numpy array before indexing instead.
  y = y[:, np.newaxis]

惠伦晶体
mupdf: kid not found in parent's kids array
     年份        年营业收入
0  2015  4.16417e+08
1  2016  3.69797e+08
2  2017  3.63278e+08
3  2019  3.09943e+08
4  2020   3.8784e+08
D:\anaconda\lib\site-packages\matplotlib\cbook\__init__.py:2064: FutureWarning: Support for multi-dimensional indexing (e.g. `obj[:, None]`) is deprecated and will be removed in a future version.  Convert to a numpy array before indexing instead.
  x[:, None]

D:\anaconda\lib\site-packages\matplotlib\axes\_base.py:248: FutureWarning: Support for multi-dimensional indexing (e.g. `obj[:, None]`) is deprecated and will be removed in a future version.  Convert to a numpy array before indexing instead.
  x = x[:, np.newaxis]

D:\anaconda\lib\site-packages\matplotlib\axes\_base.py:250: FutureWarning: Support for multi-dimensional indexing (e.g. `obj[:, None]`) is deprecated and will be removed in a future version.  Convert to a numpy array before indexing instead.
  y = y[:, np.newaxis]

有研新材
     年份        年营业收入
0  2016  3.80798e+09
1  2017  4.07962e+09
2  2018  4.76791e+09
3  2019  1.04525e+10
4  2020   1.2969e+10
D:\anaconda\lib\site-packages\matplotlib\cbook\__init__.py:2064: FutureWarning: Support for multi-dimensional indexing (e.g. `obj[:, None]`) is deprecated and will be removed in a future version.  Convert to a numpy array before indexing instead.
  x[:, None]

D:\anaconda\lib\site-packages\matplotlib\axes\_base.py:248: FutureWarning: Support for multi-dimensional indexing (e.g. `obj[:, None]`) is deprecated and will be removed in a future version.  Convert to a numpy array before indexing instead.
  x = x[:, np.newaxis]

D:\anaconda\lib\site-packages\matplotlib\axes\_base.py:250: FutureWarning: Support for multi-dimensional indexing (e.g. `obj[:, None]`) is deprecated and will be removed in a future version.  Convert to a numpy array before indexing instead.
  y = y[:, np.newaxis]

In [ ]: