前提・実現したいこと
tdnetのXBRL(拡張子.htmのファイル)の読み、BeautifuSoupでスクレイピングした結果を
print()で表示しています。
これの出力結果をCSVに書き出したいのですが、
CSVの作成ができません。
printでの出力はエラーもでず問題ないのですが、
printで出力しつつ、その結果内容をCSVにも保存させることはできるのでしょうか。
発生している問題・エラーメッセージ
NameError: name 'df' is not defined
該当のソースコード
Python3
1import datetime 2 3from urllib.request import urlopen 4from bs4 import BeautifulSoup 5import pandas as pd 6import requests 7import os 8import zipfile 9import re 10 11def fn_parse(sic , xbrl_path): 12 13 # htmファイル読み込み 14 ff = open( xbrl_path , "r" ,encoding="utf-8" ).read() 15 soup = BeautifulSoup( ff ,"html.parser") 16 17 #ファイル名には命名規則があるので、そこから属性情報等を取得 18 rpt_nm = xbrl_path.split("-")[1] 19 print(rpt_nm ) 20 21 #ix:nonnumeric 22 print( "■ix:nonnumeric" ) 23 nms = soup.find_all("ix:nonnumeric") 24 for nm in nms: 25 # print(str(nm.get("name"))) 26 27 lst = ['SecuritiesCode','URL','CompanyName','FilingDate','FiscalYearEnd'] 28 lst = lst + ['AccountingStandardsDEI','EDINETCodeDEI','CurrentFiscalYearStartDateDEI','CurrentPeriodEndDateDEI'] 29 x = [print(i,nm.text) for i in lst if i in "tse-ed-t:"+nm.get("name") ] 30 31 #ix:nonfraction 32 elems = soup.find_all("ix:nonfraction" ) 33 print( "■ix:nonfraction" ) 34 for elem in elems: 35 print(str(elem.get("name"))) 36 print(str(elem.get("contextref"))) 37 #print(str(elem.get("decimals"))) 38 #print(str(elem.get("scale"))) 39 #print(str(elem.get("unitref"))) 40 print(elem.text) 41def fn_htm(sic,fn): 42 43 url = 'https://www.release.tdnet.info/inbs/' + str(fn) 44 #XBRLダウンロード 45 fn = str(sic) +".zip" 46 os.system("wget -O " + str(fn) + " " + str(url)) 47 48 # ZIP解凍 49 with zipfile.ZipFile( str(fn), 'r' ) as myzip: 50 infos = myzip.infolist() 51 for info in infos: 52 base, ext = os.path.splitext(info.filename) 53 # htmの読み込み 54 if ext == '.htm': 55 if str(base).find('Summary')>0 or str(base).find('Attachment')>0 : 56 myzip.extract(info.filename) 57 print('■□■' + info.filename) 58 dict = fn_parse(sic , info.filename) 59 60def fn_make_df(url): 61 62 #変数設定 63 a,b,c,d,e,f = [],[],[],[],[],[] #リストを6つ用意 64 df = pd.DataFrame() #取得結果格納用のデータフレーム 65 66 #ページの閲覧 67 html = urlopen(url) 68 bsObj = BeautifulSoup(html, "html.parser") 69 tbl3 = bsObj.findAll("table")[3] 70 trs = tbl3.findAll("tr") 71 72 for tr in trs: 73 lst=[] 74 tds = tr.findAll('td') 75 for td in tds: 76 #各tdの値を各リストに各々格納 77 if td.get("class")[1] =="kjTime":a += [td.text ] #開示時刻 78 if td.get("class")[1] =="kjCode":b += [td.text ] #コード 79 if td.get("class")[1] =="kjName":c += [td.text ] #社名 80 if td.get("class")[1] =="kjTitle": d += [td.text ] 81 if td.get("class")[1] =="kjTitle": #pdfのリンクURL 82 e += [td.a.get("href") ] if td.a is not None else [td.a ] 83 if td.get("class")[1] =="kjXbrl" : #XBRLのDLリンク 84 f += [td.a.get("href") ] if td.a is not None else [td.a ] 85 86 #取得結果格納リスト群からデータフレーム生成 87 df = pd.DataFrame( 88 data={'A': a, 'B': b, 'C': c, 'D': d, 'E': e, 'F': f}, 89 columns=['A', 'B', 'C', 'D', 'E', 'F']) 90 return df 91 92def fn_tkjkj(date): 93 94 # URL文字列の生成 95 url0 = 'https://www.release.tdnet.info/inbs/' 96 url1 = url0 + 'I_list_{}_{}.html'.format('001',date) 97 print(url1) 98 99 # 該当URLを閲覧 100 html = urlopen(url1) 101 bsObj = BeautifulSoup(html, "html.parser") 102 tbl1 = bsObj.findAll("table")[1] 103 104 dv1 = tbl1.findAll("div",{"class":"kaijiSum"}) 105 dv2 = tbl1.findAll("div",{"class":"pager-O"}) 106 dv3 = tbl1.findAll("div",{"class":"pager-M"}) 107 108 if dv1 ==[]: 109 print('開示0件') 110 else: 111 #print(str(dv1).split('全')[1].split('</')[0]) 112 lst =[ int(i.string) for i in dv3] 113 if lst ==[]: 114 df = fn_make_df(url1) 115 # print(df) 116 else: 117 # ページ数の取得 118 mxpg= max(lst) 119 print( mxpg ) 120 121 # 再度URL文字列の生成 122 for i in range(mxpg): 123 s = str(i + 1) 124 print(date,url0 ) 125 url1= url0 + 'I_list_{}_{}.html'.format(s.zfill(3) , str(date)) 126 print(s , url1)# 127 128 # ページを逐次閲覧して開示情報を取得 129 df = fn_make_df(url1) 130 131 # 短信XBRLに限定(短信訂正は除外、XBRLの付いてないものも除外) 132 df = df[df["D"].str.contains('短信')] 133 df = df[~df["D"].str.contains('訂正')] 134 df = df[~df["F"].isnull()] 135 136 # XBRL(htm)の読み取り 137 x = [fn_htm(sic,fn) for sic, fn in zip(df["B"], df["F"])] 138 #x = [print(sic,fn) for sic, fn in zip(df["B"], df["F"])] 139 140 141# main 142if __name__ == '__main__': 143 144 # 日付 145 date = datetime.datetime.today().strftime("%Y%m%d") 146 fn_tkjkj(date) 147 148 149filename = "company_list.csv" 150df.to_csv(filename, encoding = 'utf-8-sig') 151files.download(filename)
試したこと
CSVへの書き出しを調べましたが、
printと一緒に出力する方法がわかりません。
補足情報(FW/ツールのバージョンなど)
google colaboratoryで実行