

こんにちは。  
皆様のお力をお借りしたく、質問をさせていただきます。

まだまだpython初心者のため、変な書き方や質問をしてしまうかもしれませんが  
ご了承いただければ幸いです。

現在、競馬の出馬表をスクレイピングしようと考えております。  
そこでスクレイピングした結果をCSVに保存しようとするため  
以下のコードを入力しました。

スクレイピングの元ページは  
[http://race.netkeiba.com/?pid=race&id=c201605050211&mode=shutuba](http://race.netkeiba.com/?pid=race&id=c201605050211&mode=shutuba)  
こちらの出馬表となります。

＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝

[code]

    import csv
    from urllib.request import urlopen
    from bs4 import BeautifulSoup
    #URLの指定
    html = urlopen("http://race.netkeiba.com/?pid=race&id=c201605050211&mode=shutuba")
    bsObj = BeautifulSoup(html, "html.parser")
    #テーブルを指定
    table = bsObj.findAll("table",{"class":"race_table_01 nk_tb_common shutuba_table"})[0]
    rows = table.findAll("th")
    
    csvFile = open("keiba.csv", 'wt', newline = '', encoding = 'utf-8')
    writer = csv.writer(csvFile)
    try:
     for row in rows:
      csvRow = []
      for cell in row.findAll(['td', 'th']):
          csvRow.append(cell.get_text())
      writer.writerow(csvRow)
    finally:
        csvFile.close()
    
[/code]

＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝

このように入力してエンターを押すと、

[code]

    80
    559
    565
    596
    634
    629
    622
    561
    578
    559
    633
    627
    545
    642
    575
    628
    
[/code]

このような数字が出力されました。

何が起こっているのかよくわからず、皆様にお伺いさせていただきたく  
質問をさせていただきます。

なお、デスクトップには出力用のCSV(keiba.csv)ファイルは作っております。

どのようにすればCSVへ直接的に入力することが可能になりますでしょうか。

また、今後はSQLを使ってデータベースに出馬表のデータを保存していきたいと考えております。  
その際に参考となるWEBページなどございましたら、ご教示頂けますと幸いです。

長々となり恐縮ではございますが、ご確認お願い致します。


CC BY-SA 3.0
2016-11-19T06:28:24.500
30532
2016-11-19T07:53:53.560
2016-11-19T06:49:02.990
3605
19188
question
python
スクレイピングした際のCSV保存(競馬の出馬表)


こういう時は本質的でない部分を切って再現するかどうかやってみます．具体的にはデータの出処は無視してよい．

[code]

    import csv
    f = open('opened.csv', 'wt',newline='',encoding='utf-8')
    writer = csv.writer(f)
    for i in ["here","there"]:
        writer.writerow(i)
    f.close()
    
[/code]

これを対話環境に打ち込むと，標準出力には `9` と `11` が出力されますが，ファイルに書き込み自体はされているはずです(`[["here"],
["there"]]` とでもすべきところでしたね）．

[code]

    $ cat opened.csv
    h,e,r,e
    t,h,e,r,e
    
[/code]

問題はこの数字が何かなのですが，どうも`writer.writerow()`は[ドキュメントに記載はないが，書き込んだ文字数を返しているらしい](https://stackoverflow.com/a/12771449/3026489)．（`csv.py`
が読み込んでいる[_csv.c
のこのあたり](https://github.com/python/cpython/blob/210eb2a4453beb164535d91bca79b5b387f77c7b/Modules/_csv.c#L1183)？）ファイルから実行
(`$ python3 script.py` ）する場合は返り値は印字されませんし，基本的に無視していいと思います．interactive
でやりたくて，印字が画面を流してしまって鬱陶しい場合は，たとえば

[code]

    _ = writer.writerow(i)
    
[/code]

で値を捨てられます．


CC BY-SA 3.0
2016-11-19T07:53:53.560
30534
2016-11-19T07:53:53.560
2017-05-23T12:38:56.083
-1
2901
30532
answer