

日経平均株価をスクレイピングして記録するプログラムを作りたいのですが、以下のプログラムだとcsvに記録がされません。なぜでしょうか？  
以下のプログラムは[この記事](https://qiita.com/Azunyan1111/items/9b3d16428d2bcc7c9406)を参考にしてPython3用に改良したものです。

[code]

    import  urllib.request, urllib.error
    from bs4 import BeautifulSoup
    from datetime import datetime
    import csv
    import time
    
    time_flag = True
    while True:
        if datetime.now().minute != 59:
            time.sleep(58)
            continue
        f = open('nikkei_heiki.csv', 'a')
        writer = csv.writer(f, lineterminator='\n')
        while datetime.now().second != 59:
            time.sleep(1)
    time.sleep(1)
    csv_list = []
    
    time_ = datetime.now().strftime("%Y/%m/%d %H:%M:%S")
    
    csv_list.append(time_)
    url = "http://www.nikkei.com/markets/kabu/"
    html = urllib.request.urlopen(url)
    soup = BeautifulSoup(html, "html.parser")
    span = soup.find_all("span")
    nikkei_heikin = ""
    
    for tag in span:
        try:
            string_ = tag.get("class").pop(0)
            if string_ in "mkc-stock_prices":
            nikkei_heikin = tag.string
            break
        except:
            pass
    
    
        print (time_, nikkei_heikin)
        csv_list.append(nikkei_heikin)
        writer.writerow(csv_list)
        f.close()
    
[/code]


CC BY-SA 4.0
2018-11-16T05:57:03.343
50375
2018-11-17T02:42:36.983
31020
question
python python3
csvに記録がされないです。


質問に記載のコードでは、毎時59分でないと動作しませんが、それではデバッグをすることが難しいので、日経平均株価をスクレイピング部分を関数にした方がいいです。以下のように関数にすると、インデントがおかしいだけで質問に記載のもので動作します。ただし、`f
= open('nikkei_heiki.csv', 'a')`とファイルをオープンするコードは、`try
finally`を使うか`with`構文で使うかしないと、エラーが発生した時等にファイルが開き放しになってしまうので修正しておきました。

[code]

    def get_kabu():
        csv_list = []
    
        time_ = datetime.now().strftime("%Y/%m/%d %H:%M:%S")
        csv_list.append(time_)
        url = "http://www.nikkei.com/markets/kabu/"
        html = urllib.request.urlopen(url)
        soup = BeautifulSoup(html, "html.parser")
        span = soup.find_all("span")
        nikkei_heikin = ""
    
        for tag in span:
            try:
                string_ = tag.get("class").pop(0)
                if string_ in "mkc-stock_prices":
                    nikkei_heikin = tag.string
                    break
            except:
                pass
    
        print (time_, nikkei_heikin)
        csv_list.append(nikkei_heikin)
        with open('nikkei_heiki.csv', 'a') as f:
            writer = csv.writer(f, lineterminator='\n')
            writer.writerow(csv_list)
    
    get_kabu()
    
[/code]

また、BeautifulSoupは、tagと一緒にclassも検索できるので次のように簡単にかけます。

[code]

    def get_kabu():
        time_ = datetime.now().strftime("%Y/%m/%d %H:%M:%S")
        url = "http://www.nikkei.com/markets/kabu/"
        html = urllib.request.urlopen(url)
        soup = BeautifulSoup(html, "html.parser")
        try:
            nikkei_heikin = soup.find("span", class_="mkc-stock_prices").text
        except AttributeError:
            nikkei_heikin = ""
        print (time_, nikkei_heikin)
        with open('nikkei_heiki.csv', 'a') as f:
            writer = csv.writer(f, lineterminator='\n')
            writer.writerow([time_, nikkei_heikin])
    
[/code]


CC BY-SA 4.0
2018-11-17T02:17:31.277
50390
2018-11-17T02:42:36.983
2018-11-17T02:42:36.983
15171
15171
50375
answer