###前提・実現したいこと
python超初心者でございます。
netkeiba.comから競馬データをスクレイピングしております。
スクレイピング自体はうまく出来たのですが、csvに保存する時に、
アウトプットに、「一致しない列数を検出しました。」というメッセージが出現して、
列と行が合わずに苦慮しております。
###発生している問題・エラーメッセージ
アウトプットに、「一致しない列数を検出しました。」というメッセージが出現します
###該当のソースコード
# -*- coding:utf-8 -*- import urllib2 import codecs import time from bs4 import BeautifulSoup f = codecs.open('race.csv', 'w', 'utf-8') f.write('frame_number,horse_number,horse_name,sex_age,weight,jockey_name,horse_house,horse_weight,horse_odds,popularity'+u"\n") url='http://race.netkeiba.com/?pid=race_old&id=c201604020801' soup = BeautifulSoup(urllib2.urlopen(url).read(),"lxml") tr_arr = soup.select("table.race_table_old > tr ") for tr in tr_arr: time.sleep(1) tds = tr.findAll("td") if len( tds ) > 1: frame_number=tds[0].text #枠番 horse_number=tds[1].text #馬番 horse_name=tds[3].text #馬名 sex_age=tds[4].text #性齢 weight=tds[5].text #負担重量 jockey_name=tds[6].text #騎手 horse_house=tds[7].text #厩舎 horse_weight=tds[8].text #馬体重 horse_odds=tds[9].text #単勝オッズ popularity=tds[10].text #人気 print frame_number.strip(),horse_number.strip(),horse_name.strip(),sex_age.strip(),weight.strip(),jockey_name.strip(),horse_house.strip(),horse_weight.strip(),horse_odds.strip(),popularity.strip() cols = [frame_number,horse_number,horse_name,sex_age,weight,jockey_name,horse_house,horse_weight,horse_odds,popularity] f.write(",".join(cols) + "\n") f.close()
###試したこと
print のスクリプトを、frame_number.strip()の場合と、.strip()を削除した場合の両方試しましたが、どちらもcsvの行、列が整列しません。
該当のソースコードで動かしますと、コマンドプロンプトでの出力は上手く出来ました。
(参考)em editorのヘルプを参照いたしました。結果は下記の通りです。
セル内改行を含む CSV の認識に失敗することがある
上記のヘルプの回答は以下の通りでした。
再現条件がどうにも分らないのですが,セルの中に改行を含む CSV の認識にときどき失敗するようです。
CSV は RFC 4180 に従ったものです。
現象としては,カンマ区切りテキストとしておおむね正しく認識するものの,セル内の改行のあとが次の CSV 行とみなされてしまいます。
したがって,「一致しない列数を検出しました」がだーっと出ます。
結果が安定しないので,再現手順や再現データは今のところ提示できません。
気の付いたことを箇条書きにします:
- 既に書いたように CSV は RFC 4180 に従っている。(セル内改行を含むセルの値はダブルクオートで囲んでいる)
- 同じファイルでも,正常に認識したり,現象(不具合)が出たりする。
- 正常に認識されることのほうが多い。
- 現象(不具合)が起きているとき,いったん「通常モード」に切り替えたあと,再び「カンマ区切り」にすると直ることがある。
- 正常に認識している場合でも,いったん「通常モード」に切り替えたあと,再び「カンマ区切り」にすると現象(不具合)が再現することがある。
- 要するに安定しない。
- 最近のバージョンから起き出したような気がする。
- Version 15.3.0 で現象を確認した。
- CSV 行の区切りの改行とセル内改行とで改行コードが違っている場合に起きるのかと思ったが,そういうわけでもなさそうだった。
- ファイルサイズによって起きやすいかどうかは不明。とりあえず今日は 12 KB 程度のファイルで現象を認めた。
なお,この件と関係するかどうか分りませんが,正常に認識できたとき,改行を含むセル値を持った行の行番号が太字になります。
これってそういう仕様ですか? 行番号の太字って,修正した行を示すものですよね?
3行目から5行目の現象が、まさに、今、小生が苦慮している現象でございます。
上記のヘルプも参考にはしましたが、不具合は解決しませんでした。
他の上手く動く競馬情報のスクレイピングのスクリプトと同じ手法で作成しましたが、他のスクリプトでは上手くcsv出力が出来ます。ソースコードを並べて確認しましたが、.strip()の有無の違いくらいでした。
上手く動く他のスクリプトはprintのスクリプトに.strip()がないスクリプトでございます。
何が原因なのか、小生の出来る範囲で調べたつもりでございます。
御教示、ヒント、よろしくお願いいたします。
###補足情報(言語/FW/ツール等のバージョンなど)
python2.7
回答1件
あなたの回答
tips
プレビュー