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

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

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

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

Q&A

解決済

2回答

1953閲覧

python2.7,beautifulsoupでの競馬情報のスクレイピングが、途中から、うまく出来ません。

akakage13

総合スコア89

Python

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

0グッド

0クリップ

投稿2017/06/10 23:17

netkeiba.com様からのサイトより、python2.7,beautifulsoupで行う、競馬情報のスクレイピングが、途中から、うまく出来ません。

# -*- coding:utf-8 -*- import urllib2 import codecs import time from bs4 import BeautifulSoup url = 'http://db.netkeiba.com/horse/2007100001/' soup = BeautifulSoup(urllib2.urlopen(url).read(), "lxml") tekisei = soup.find('div', {'class': 'db_h_rank_review'}).findAll('td') imgs = tekisei[0].findAll('img') shiba_style = imgs[1].attrs['width'] shiba_style_1 = imgs[5].attrs['width'] print shiba_style,shiba_style_1

上記のスクリプトを動かしますと、

Traceback (most recent call last): File "C:\Users\satoru\horse\horse\test_horse_hyouka.py", line 16, in <module> shiba_style_1 = imgs[5].attrs['width'] IndexError: list index out of range
shiba_style_1 = imgs[5].attrs['width']

どうも、5番目の属性はないとの返事が返ってまいりました。
当該部分のソースコードを調べてみますと、

<div class="db_h_rank_review"> <div class="categorybar_line" > <h3 class="categorybar"><img src="http://cimg2.db.netkeiba.com/style/netkeiba.ja/image/icon_db_tekisei_02.png" width="20" height="20" alt="" />みんなの適性レビュー</h3> </div> <dl> <dd> <table summary="ヴィップスターの適性レビュー"> <tr> <th>コース適性</th> <td><img src="http://cimg2.db.netkeiba.com/style/netkeiba.ja/image/review_turf_blue.png" width="26" height="17" alt="芝" /><img src="http://cimg2.db.netkeiba.com/style/netkeiba.ja/image/review_bar_blue.png" width="145" height="17" /><img src="http://cimg2.db.netkeiba.com/style/netkeiba.ja/image/review_centerline.png" width="1" height="17" /><img src="http://cimg2.db.netkeiba.com/style/netkeiba.ja/image/review_bar_gray.png" width="49" height="17" /><img src="http://cimg2.db.netkeiba.com/style/netkeiba.ja/image/review_dirt_gray.png" width="26" height="17" alt="ダート" /></td> </tr> <tr> <th>距離適性</th> <td><img src="http://cimg2.db.netkeiba.com/style/netkeiba.ja/image/review_sprint_blue.png" width="26" height="17" alt="短い" /><img src="http://cimg2.db.netkeiba.com/style/netkeiba.ja/image/review_bar_blue.png" width="194" height="17" /><img src="http://cimg2.db.netkeiba.com/style/netkeiba.ja/image/review_centerline.png" width="1" height="17" /><img src="http://cimg2.db.netkeiba.com/style/netkeiba.ja/image/review_bar_gray.png" width="1" height="17" /><img src="http://cimg2.db.netkeiba.com/style/netkeiba.ja/image/review_styer_gray.png" width="26" height="17" alt="長い" /></td> </tr> <tr> <th>脚質</th> <td><img src="http://cimg2.db.netkeiba.com/style/netkeiba.ja/image/review_nige_blue.png" width="26" height="17" alt="逃げ" /><img src="http://cimg2.db.netkeiba.com/style/netkeiba.ja/image/review_bar_blue.png" width="194" height="17" /><img src="http://cimg2.db.netkeiba.com/style/netkeiba.ja/image/review_centerline.png" width="1" height="17" /><img src="http://cimg2.db.netkeiba.com/style/netkeiba.ja/image/review_bar_gray.png" width="1" height="17" /><img src="http://cimg2.db.netkeiba.com/style/netkeiba.ja/image/review_oikomi_gray.png" width="26" height="17" alt="追込" /></td> </tr> <tr> <th>成長</th> <td><img src="http://cimg2.db.netkeiba.com/style/netkeiba.ja/image/review_soujuku_gray.png" width="26" height="17" alt="早熟" /><img src="http://cimg2.db.netkeiba.com/style/netkeiba.ja/image/review_bar_gray.png" width="1" height="17" /><img src="http://cimg2.db.netkeiba.com/style/netkeiba.ja/image/review_centerline.png" width="1" height="17" /><img src="http://cimg2.db.netkeiba.com/style/netkeiba.ja/image/review_bar_blue.png" width="194" height="17" /><img src="http://cimg2.db.netkeiba.com/style/netkeiba.ja/image/review_bansei_blue.png" width="26" height="17" alt="晩成" /></td> </tr> <tr> <th>重馬場</th> <td><img src="http://cimg2.db.netkeiba.com/style/netkeiba.ja/image/review_tokui_blue.png" width="26" height="17" alt="得意" /><img src="http://cimg2.db.netkeiba.com/style/netkeiba.ja/image/review_bar_blue.png" width="97" height="17" /><img src="http://cimg2.db.netkeiba.com/style/netkeiba.ja/image/review_centerline.png" width="1" height="17" /><img src="http://cimg2.db.netkeiba.com/style/netkeiba.ja/image/review_bar_gray.png" width="97" height="17" /><img src="http://cimg2.db.netkeiba.com/style/netkeiba.ja/image/review_nigate_gray.png" width="26" height="17" alt="苦手" /></td> </tr>

小生のエラーの理由は、このソースコードの中にございます、この部分

</tr>

**この</tr>処理がうまくいかず、エラーが出ていると、個人的には考えております。
**

つまり、

上記のソースコードの場合、既に取れている、

<th>コース適性</th> width="145" の数値と併せて、以下、同様に <th>距離適性</th> width="194" <th>脚質</th> width="194" <th>成長</th> width="1" <th>重馬場</th> width="97"

の数値を取ることが出来るように、したいのです。

</tr>処理が原因とは断定できませんが、いろいろ試しましたが、うまく出来ませんでした。

先輩方の御教示、よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

取得したい要素はth要素と、tdの子の複数のimg要素のうち2番目のimgwidth属性の値でいいんですよね?

Python3.x系になってしまい申し訳ないのですが、

python

1from urllib.request import urlopen 2from bs4 import BeautifulSoup 3 4url = 'http://db.netkeiba.com/horse/2007100001/' 5soup = BeautifulSoup(urlopen(url), 'lxml') 6trs = soup.find('div', {'class': 'db_h_rank_review'}).select('tr') 7 8 9for tr in trs: 10 imgs = tr.td.select('img') 11 print(tr.th.text) 12 print(imgs[1]['width']) 13 14"""結果 15コース適性 16145 17距離適性 18194 19脚質 20194 21成長 221 23重馬場 2497 25"""

thtdtr要素の子になっていることはわかりますか?
この場合、trをすべて取得できればいけそうですよね。

ということで、
findでとってきたdiv要素からselect()を呼び出して引数にtrを渡します。
そうすると、divの内側にあるtr要素をリストで返してくれるので、それぞれの要素に処理をします。
imgタグも同様です。

他にもやり方はあるかもしれませんが、今思いついたのはこれくらいです。

投稿2017/06/11 01:23

kurosuke___

総合スコア217

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

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

akakage13

2017/06/11 02:37

E3KUROSUKE様、御教示ありがとうございました。小生、python3への移行も考えておりますので、 今回も、とても有益なスクリプト頂戴いたしました。 今後とも、よろしくお願いいたします。
guest

0

ベストアンサー

たぶん5番目というのは

2番目(index=1)の**<td>タブの中にある2番目(index=1)の<img>**タブ

の事かと思われます。

ですので、

Python

1imgs = tekisei[1].findAll('img') 2shiba_style_1 = imgs[1].attrs['width']

のように取り出せます。
同様に、それ以降の値は

Python

1imgs = tekisei[2].findAll('img') 2shiba_style = imgs[1].attrs['width'] 3print(shiba_style) 4 5imgs = tekisei[3].findAll('img') 6shiba_style = imgs[1].attrs['width'] 7print(shiba_style) 8 9imgs = tekisei[4].findAll('img') 10shiba_style = imgs[1].attrs['width'] 11print(shiba_style)

のようにすると取り出せると思います。

また、上記はループにて

Python

1tekisei = soup.find('div', {'class': 'db_h_rank_review'}).findAll('td') 2for t in tekisei: 3 imgs = t.findAll('img') 4 width = imgs[1].attrs['width'] 5 print(width)

のようにまとめることができます。

投稿2017/06/11 01:01

magichan

総合スコア15898

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

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

akakage13

2017/06/11 02:38 編集

magichan様、うまく動きました。スッキリいたしました!!! 御教示、本当にありがとうございました。 今後とも、よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問