質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.40%

  • Python

    12785questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Python 2.7

    1486questions

    Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

python2.7,beautifulsoupでスクレイピングしたCSVの競馬データの1列目に騎手の名前を挿入する方法を教えてくださいませ。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,298

akakage13

score 80

前提・実現したいこと

python初心者でございます。

競馬の騎手のデータを集めております。
beautifulsoupでスクレイピングしたCSVレースデータ1列目に騎手の名前を挿入したいのですが
うまく出来ません。

発生している問題・エラーメッセージ

C:\Users\satoru\horse>kami-2.py
Traceback (most recent call last):
  File "C:\Users\satoru\horse\kami-2.py", line 46, in <module>
    print jockey_name,race_date,kaisai,weather,race_name,tousuu,frame_number,horse_number,single_win
_racio,popularity,horse_arrival,horse_name,weight,distance,baba,race_time,difference,horse_pass,pace
,nobori,horse_weight,win_horse
UnicodeEncodeError: 'cp932' codec can't encode character u'\xa0' in position 4: illegal multibyte se
quence

該当のソースコード

# -*- coding:utf-8 -*-

import urllib2
import codecs
import time
from bs4 import BeautifulSoup
f = codecs.open('horse.csv','w','utf-8')
f.write('jockey_name,race_date,kaisai,weather,race_number,race_name,tousuu,frame_number,horse_number,single_win_ratio,popularity,horse_arrival,horse_name,weight,distance,baba, race_time,difference,horse_pass,pace,nobori,horse_weight,win_horse'+ u"\n")

tpl_url='http://db.netkeiba.com/?pid=jockey_detail&id=00663&page={0}'

for i in xrange(1,2):
    url=tpl_url.format( i )
    soup = BeautifulSoup(urllib2.urlopen(url).read(),"lxml")

    jockey_name = soup.find('div',{'class':'db_head_name'}).find('h1').text.replace("\n","")

    tr_arr = soup.select("table.race_table_01>tbody>tr")
    for tr in tr_arr:
        tds = tr.findAll("td")
        time.sleep(1)    
        race_date = tds[0].a.text    #日付
        kaisai = tds[1].a.text     #開催
        weather=tds[2].text    #天気
        race_number=tds[3].text  #R
        race_name=tds[4].a.text    #レース名
        tousuu=tds[6].text    #頭数
        frame_number=tds[7].text    #枠番
        horse_number=tds[8].text    #馬番
        single_win_racio=tds[9].text    #単勝
        popularity=tds[10].text    #人気
        horse_arrival=tds[11].text    #着順
        horse_name=tds[12].a.text     #馬名
        weight=tds[13].text    #斤量
        distance=tds[14].text    #距離
        baba=tds[15].text    #馬場
        race_time=tds[16].text    #タイム
        difference=tds[17].text    #着差
        horse_pass=tds[18].text    #通過
        pace=tds[19].text    #ペース
        nobori=tds[20].text    #上り
        horse_weight=tds[21].text    #馬体重
        win_horse=tds[22].a.text    #勝ち馬

print jockey_name,race_date,kaisai,weather,race_name,tousuu,frame_number,horse_number,single_win_racio,popularity,horse_arrival,horse_name,weight,distance,baba,race_time,difference,horse_pass,pace,nobori,horse_weight,win_horse

cols = [jockey_name,race_date,kaisai,weather,race_number,race_name,tousuu,frame_number,horse_number,single_win_racio,popularity,horse_arrival,horse_name,weight,distance,baba,race_time,difference,horse_pass,pace,nobori,horse_weight,win_horse]

f.write(",".join(cols) + "\n")

f.close()

試したこと

補足情報(言語/FW/ツール等のバージョンなど)

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • argius

    2016/08/14 22:48

    掲載していただいたコードは一部インデントが崩れていますね。これだとPythonは上手く動かないはずです。正しく動作するコードを掲載してください。

    キャンセル

  • argius

    2016/08/14 23:13

    タグについてですが、一連のご質問は一般的な配列にはあまり関係のない質問と思います。ご質問の内容であれば、タグはPythonとPython 2.7だけにしていただいた方が回答が得られやすくなったりしますのでおすすめです。

    キャンセル

回答 1

checkベストアンサー

+1

タグ自体は取得できています。
後はそれがタグオブジェクト(bs4.element.Tag型)のままなのが問題で、それが原因でエラーが出ています。

.textを付ければ、h1タグに囲まれた部分のテキストが取得できます。
さらに改行文字が邪魔なので、それもreplace()で取り除きましょう。

...と思いましたが、\xa0という謎の空白文字が含まれてしまっていますね。
これはreplace()だと対応できないので、
下記のように、文字単位で不要なものを除去させるようにします。

# j_name = soup.find('div', {'class':'db_head_name'}).find('h1').text.replace("\n", "")
jockey_name_tag = soup.find('div', {'class': 'db_head_name'}).find('h1')
jockey_name = "".join([x for x in jockey_name_tag.text if not x == u'\xa0' and not x == u'\n'])

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/15 04:56

    argius様、いつも御指導ありがとうございます。
    ソースコードでkaisai から次のところで貼り付けると、なぜかインデントしてしまいます。
    貼り付ける直前のソースコードは正しいと確認しているつもりでございます。
    よろしく御教示お願いいたします。

    キャンセル

  • 2016/08/15 05:07

    おそらくですが、インデントにタブ文字と半角スペース文字が混在しているためだと思います。
    ソースコードを書いているエディターで、タブ文字と半角スペース文字の区別ができる表示になるように設定を変更してみると良いです。
    その上で、インデントをタブ文字と半角スペース文字のどちらかに統一するようにしてください。
    (質問にタブ文字で張り付けると実際の表示と変わってしまうので、こういう場面では半角スペース文字のほうが良いかも知れません。)

    そういう設定ができないエディターでしたら、できればそれができるものに変えたほうが良いです。

    キャンセル

  • 2016/08/15 19:58

    argius様、御教示いただきましたインデントを浄書して、jockey_nameのスクリプトも差し替えましたが、上記のようなエラーが出てきてしまいます。
    インデントの御教示はとてもすっきりして感謝しております。

    エラーの対応方法について、よろしくお願いいたします。

    キャンセル

  • 2016/08/15 21:27

    きれいにしていただいて、ありがとうございます。
    今度はprint jockey_name, ... 以降のインデントが消えてしまっています。

    それと、tr_arr = soup.select("table.race_table_01>tbody>tr")
    のところ、>の前後にスペースが無いと
    私の環境ではデータが取得できませんでした。

    そこを修正して実行すると、確かにエラーが出ますね。
    これは、もう1つの質問(https://teratail.com/questions/44294)
    同じ原因で、空白文字があるせいだと思います。
    ですが、こちらの問題はstrip()では対応できないようですので、
    修正方法を回答に記載しました。

    キャンセル

  • 2016/08/16 07:26

    argius様、いつもありがとうございます。
    上記の差し替えスクリプト、ありがとうございました。
    大変、きれいに動き、感激しております。
    これからも御指導賜りますようよろしくお願いいたします。
    重ねて、御礼申し上げます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.40%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Python

    12785questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Python 2.7

    1486questions

    Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

  • トップ
  • Pythonに関する質問
  • python2.7,beautifulsoupでスクレイピングしたCSVの競馬データの1列目に騎手の名前を挿入する方法を教えてくださいませ。