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

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

新規登録して質問してみよう
ただいま回答率
85.49%
Python 2.7

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

Python

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

Q&A

解決済

1回答

2218閲覧

python2.7,beautifulsoupでのスクレイピングにおいて、途中から出現する空欄の対応等が、うまく出来ません。

akakage13

総合スコア89

Python 2.7

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

Python

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

0グッド

0クリップ

投稿2016/08/14 11:46

編集2016/08/14 20:09

###前提・実現したいこと
python初心者でございます。
競馬情報の中の馬の情報をスクレイピングしておりますが、データのない空欄の処理に苦慮しております。
printする際に、以下のエラーメッセージが発生しました。

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

1998/11/01 4東京8 晴 天皇賞(秋)(G1) 12 1 1 1.2 1 中 武豊 58 芝2000 良 Traceback (most recent call la st): File "C:\Users\satoru\horse\horse-test-kami-1.py", line 44, in <module> race_time,difference,horse_pass,pace,nobori,horse_weight,win_horse UnicodeEncodeError: 'cp932' codec can't encode character u'\xa0' in position 3: 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('race_date,kaisai,weather,race_number,race_name,tousuu,frame_number,horse_number,horse_odds,popularity,horse_arrival,jockey_name,weight,distance,baba, race_time,difference,horse_pass,pace,nobori,horse_weight,win_horse'+ u"\n") url='http://db.netkeiba.com/horse/1994103997/' soup = BeautifulSoup(urllib2.urlopen(url).read(),"lxml") tr_arr = soup.select("table.db_h_race_results > tbody > tr") for tr in tr_arr: tds = tr.findAll("td") 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 #馬番 horse_odds=tds[9].text #オッズ popularity=tds[10].text #人気 horse_arrival=tds[11].text #着順 jockey_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].text #勝ち馬(2着馬) print race_date, kaisai,weather,race_name,tousuu,frame_number,horse_number,\ horse_odds,popularity,horse_arrival,jockey_name,weight,distance,baba,\ race_time,difference,horse_pass,pace,nobori,horse_weight,win_horse cols = [race_date, kaisai,weather,race_number,race_name,tousuu,frame_number,\ horse_number,horse_odds,popularity,horse_arrival,jockey_name,weight,\ distance,baba,race_time,difference,horse_pass,pace,nobori,horse_weight,win_horse] f.write(",".join(cols) + "\n") #single_win_racio,horse_nameという変数が未定義になっています。これの定義を追記してください。

###試したこと
空欄の処理における問題なのか、文字化けが原因の問題なのかも分からずに苦慮しております。
御教示、よろしくお願いいたします。

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

argius

2016/08/14 14:08

single_win_racio,horse_nameという変数が未定義になっています。これの定義を追記してください。
akakage13

2016/08/14 20:12

argius様、いつも御指導ありがとうございます。上記の変数は削除して、新たな変数を定義いたしました。なお、kaisai以降のインデントが貼り付け時にずれてしまい、御迷惑をおかけしています。申し訳ございません。 よろしくお願いいたします。
guest

回答1

0

ベストアンサー

空データの場合、謎の空白文字(0xA0=EUC-JPのエスケープシーケンス?)が含まれてしまい、それをprintしようとするとエンコードに失敗してしまっているようです。

文字列にstrip()をつけて、不要な空白文字を除去しましょう。
少し面倒ですが、printしているすべての変数に例えばdistanceならdistance.strip()のように付けてください。

CSVにも不要な空白を出力したくなければ、distance=tds[14].text.strip()のように取得して変数に入れるときにstrip()を付けましょう。
こちらの方法にするならprintの方にはstrip()は付けなくて良いです。

同じような処理が続くので共通化したいところですが、ご質問の趣旨から外れてしまうのでここまでにしておきます。

投稿2016/08/14 20:44

argius

総合スコア9388

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

akakage13

2016/08/16 10:35

argius様、御指導ありがとうございました。 printに.strip()を付けまして、きれいにCSV出力することが出来ました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問