

こんにちは  
ご覧いただきましてありがとうございます。

pythonを活用したスクレイピングの件で、質問させていただきます。

■質問内容  
web上から競馬の出馬表をスクレイピングしておりますが、一部しかcsvに書き込まれておりません。  
スクレイピングを行なった結果、出馬表の表頭部分（馬名・枠番といった列名）しかcsvには書き込まれておらず、  
馬の名前や厩舎、オッズなどがcsvに書き込まれておりません。

以下に参照しているページとコードを記載いたしますので  
御確認いただくと幸いです。

> import csv  
>  from urllib.request import urlopen  
>  from bs4 import BeautifulSoup
>
> # URLの指定
>
> html =
> urlopen("[http://race.netkeiba.com/?pid=race&id=c201605050211&mode=shutuba](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("tr")
>
> csvFile = open("shutuba.csv", 'wt', newline = '', encoding =  
>  'shift_jis')  
>  writer = csv.writer(csvFile)  
>  try: for row in rows:  
>  csvRow = []  
>  for cell in row.findAll(['th', 'td']):  
>  csvRow.append(cell.get_text())  
>  writer.writerow(csvRow)  
>  finally:  
>  csvFile.close()

このようにターミナル上へ入力するとcsvは作成されるのですが、  
表の上部分のみで、肝心の馬の名前などは情報が書き込まれておりません。

[![画像の説明をここに入力](https://i.stack.imgur.com/1l513.png)](https://i.stack.imgur.com/1l513.png)

おそらくスクレイピングのコマンド自体ではなく、  
csv書き込み時のコマンドがあまり良くないのかと  
推察をしているのですが、何をやってもうまくいかず  
皆様の知識をお借りしたいと思います。

コマンドで修正すべきポイントなど、教えて頂けますでしょうか。


CC BY-SA 3.0
2016-11-23T14:58:52.480
30617
2016-11-23T16:32:37.413
19188
question
python web-scraping
pythonスクレイピングにて一部しかcsvに書き込まれない・・？


おそらく`for`部分のインデントが間違っています。  
あとENCODEを`utf-8`に変えた方が良いとエラー文がでました。  
下記コピペでCSVファイルが生成されます。

[code]

    import csv
    from urllib.request import urlopen
    from bs4 import BeautifulSoup
    
    
    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("tr")
    
    csvFile = open("shutuba.csv", 'wt', newline = '', encoding ='utf-8')
    writer = csv.writer(csvFile)
    try:
        for row in rows:
            csvRow = []
            for cell in row.findAll(['th', 'td']):
                csvRow.append(cell.get_text())
                writer.writerow(csvRow)
    finally:
        csvFile.close()
    
[/code]

追伸  
スタックオーバーフローでコードをコーティングするにはコード部分を選択して上の{}でできます。


CC BY-SA 3.0
2016-11-23T16:32:37.413
30618
2016-11-23T16:32:37.413
7973
30617
answer