Python←Pythonでスクレイピング(メモ10:n番目指定・思わぬ落とし穴)→Pythonでスクレイピング(メモ12:次の課題はJavaScriptへの対応)こんばんは。Pythonでスクレイピング奮闘メモです。今回はタグの属性表記の違いによる対応と、これまでの復習になってます。ファーストブック」(142ページ以降中心)以下試行錯誤メモ。新たな問題が発生(続き)もう一度通して何がしたいのかおさらい。JRAの重賞一覧ページから各重賞結果ページにクロールして、単勝人気順と最終オッズをスクレイピングするコードを作成していました。結果ページのソースが2017年の途中から変わっていたため、それの対応を頑張りました。前々回(メモ9:文字列の置換とリスト作成)ようやく完了したんですが、念の為さらに遡って調べると・・・12015年以前の重賞一覧ページ22006年途中以前の結果ページ以上のソースが違いました。12015年以前の重賞一覧ページ前回(メモ10:n番目指定・思わぬ落とし穴)完遂。22006年途中以前の結果ページ結果ページでスクレイピングしたい情報は「単勝人気・オッズ」の2つです。2006年12月24日開催の有馬記念の結果ページのソース(一部、2007〜1017途中まで同様)。1番人気</td>・・・(複勝なども同様)太字がスクレイピングしたい箇所。タグの細かい指定など、このソースに対応した話が前々回(メモ7:色々なソースに対応する・メモ8:for文を使う・メモ9:文字列の置換とリスト作成)までの話。次に2006年1月5日開催の中山金杯の結果ページのソース(一部)。</td></tr>・・・(以後繰り返し)・・・<td>タグの属性はalign=RIGHT。同日開催の京都金杯の結果ページのソース(一部)。</td></tr>・・・(以後繰り返し)・・・<td>タグの属性はalign=right。同年2月19日開催のフェブラリーSの結果ページのソース(一部)。・・・(以後繰り返し)・・・<td>タグの属性はalign=RIGHTだが、その直下の<font>タグに情報がある(ただし2005〜2006途中のみ)。先の2つとは<table>タグの属性が微妙に違う(border値など)。前半(単勝人気)は他の<table>タグとの区別が可能な「ID=”W01D_D2“」が同じなので問題無いが、後半(オッズ)はそれが無い。そのため<table>タグのborder値やcellpadding値などの属性値を細かく指定せざるを得ない。<td>タグ・<table>タグ同様にまずは愚直に(不格好だが)if文で対処した。<td>タグ(単勝人気)の方は前回(メモ10:n番目指定・思わぬ落とし穴)学んだn番目指定とfor文を組み合わせればもう少しスマートに対処できる。<table>タグ(オッズ)の方はfor文と組み合わせても上手くいかず。2004年以前は<table>タグ内の<tr>タグ直下のタグが微妙に変わっている箇所があり、<td>タグの個数が違う場合があったから。n番目固定されていないため前々回(メモ9:文字列の置換とリスト作成)学んだリストからリストを作成する形で対処した。これまでの復習感が強いので、タグの属性表記に関して色々試してみました。タグの属性表記の違い色々メモ7:色々なソースに対応するではタグの属性指定方法を学びました。その時は属性値が同年であれば統一されていたため問題になりませんでした。今回はその属性値のソース上での表記が違いました。試した結果、以下のことが分かりました。属性値が数字のみの場合、ソース上での表記に関係なく「”」で必ず囲う実際に2006年1月5日開催の中山金杯の結果ページでデバッグして見てみましょう。5つの情報が入っています。「td[align=RIGHT]」(属性値を大文字)で指定。']当然ながら上手くいきます。次に「td[align=right]」(属性値を小文字)で指定。td[align=right]::text').extract())[]残念ながら該当なしとなってしまいました。このように属性値の大文字・小文字は区別されます。属性名は、属性値やソース上での表記に関係なく区別されないまずは「td[ALIGN=RIGHT]」(属性名は全て大文字)で指定。