見出し画像

(文系のPython) インターネットから取得したデータをMicrosoft Excelに保存する-2

(目的)
Yahoo Financeから取得したEPSと売上高コンセンサス予想と、ガイダンスのコンセンサス予想をMicrosoft Excelに保存する。データを既存のエクセルに追加する。アウトプットは下記。1行目はあらかじめインプットしていた。

(背景)
EPSと売上高のコンセンサス予想は決算が終わったらYahoo Financeのサイトから追えなくなってしまうためMicrosoft Excelに保存。文系だからデータベースは不都合が出てくるまではExcel。テーブルの中身も見たいから。

(前提条件)
・Pythonをインストールしている
・コマンドプロンプトからpyファイルを呼び出せる
・BeautifulSoupをインストールしている
・openpyxlをインストールしている

(やり方)

まずは、openpyxl.load_workbook('xxxx')で既存のエクセルファイルを読み込む。

import openpyxl
import re

wb = openpyxl.load_workbook('sample2.xlsx')

次にthタグからPeriodの情報を取得。
愚直な正規表現。。ここに時間を使わず。
qtr = re.sub(r".*\(", "", qtr)
qtr = qtr.replace(")", "")

th_tags = soup('th')

for tag in th_tags:
    try:
        if tag.span.text == "Earnings Estimate":
            qtr = tag.next_sibling.span.text
            qtr = re.sub(r".*\(", "", qtr)
            qtr = qtr.replace(")", "")
            break
    except:
        pass

lst.append(qtr)

エクセルの空いている行に値を入れるために、while True を回してA2セルからひとつずつ下の値を見ていき、値が入るまでcntに1ずつ足していく。

cnt = 0
while True:
    if ws['A2'].offset(row=cnt, column=0).value == None:
        break
    cnt += 1

最後に、A2から先ほど取得したcntに入ってる数字分下にいったセルからリストlstに入っている値を順番に横に入れていく。

c = 0
for x in lst:
    try:
        x = float(x)
    except:
        pass
    ws['A2'].offset(row=cnt, column=c).value = x
    c += 1

wb.save("sample2.xlsx")

おしまい。


コード全文。

import openpyxl
import re

wb = openpyxl.load_workbook('sample2.xlsx')

# grab the active worksheet
ws = wb.active

from urllib.request import urlopen
from bs4 import BeautifulSoup

inpt = input('input Ticker symbol:')
url = "https://finance.yahoo.com/quote/%s/analysis" %inpt

html = urlopen(url).read()
soup = BeautifulSoup(html,'html.parser')

th_tags = soup('th')

for tag in th_tags:
    try:
        if tag.span.text == "Earnings Estimate":
            qtr = tag.next_sibling.span.text
            qtr = re.sub(r".*\(", "", qtr)
            qtr = qtr.replace(")", "")
            break
    except:
        pass

td_tags = soup('td')

lst = []

lst.append(inpt)
lst.append(qtr)

c = 0
for tag in td_tags:
    try:
        if tag.span.text == "Avg. Estimate":
            lst.append(tag.next_sibling.span.text)
            lst.append(tag.next_sibling.next_sibling.span.text)
            c += 1
        if c ==2:
            break
    except:
        pass

cnt = 0
while True:
    if ws['A2'].offset(row=cnt, column=0).value == None:
        break
    cnt += 1

c = 0
for x in lst:
    try:
        x = float(x)
    except:
        pass
    ws['A2'].offset(row=cnt, column=c).value = x
    c += 1
print(lst)

wb.save("sample2.xlsx")
ありがとうございます!褒められるって、うれしいですね。
1986年生まれ / シンガポール在住中
コメントを投稿するには、 ログイン または 会員登録 をする必要があります。