【Python学習中】 スクレイピング小ネタ1 classもidもないtableタグを指定して抽出したいとき
今回は、スクレイピングの小ネタを紹介します。
おそらく、もっといい方法はあると思いますが
問題の解決はできたので、備忘録として残したいと思います。
◆目次◆
classもidもないtableタグを指定して抽出したいとき
デベロッパーツールで「Copy selector」でコピーした内容が以下のような場合
「body > table > tbody > tr:nth-child(3) > td > table:nth-child(2)」
select()メソッドを使ってもうまくいかないときがありました。
すごく限定的な場面ですが、そんな時は、以下の手順を試してみてください。
手順
1. 一旦find_all()メソッドでtableタグを抽出する
2. tableタグの中身の要素数をlen関数で確認する
※find_all()メソッドの抽出結果は、リスト型に格納されます
3. ほしいtableタグが何番目にあるのかをデベロッパーツールで確認して指定する
今回はtableタグで説明していますが、もちろんほかのタグでも可能です。
(要素数が多くて大変かもしれませんが・・・)
この手順で、実際にお題を設けて実演してみます。
今回のお題
「Yahoo! Japan 天気・災害」のトップページの検索窓で「東京」した結果の画面
「https://weather.yahoo.co.jp/weather/search/?p=東京」から
「レジャー施設」のtableタグの情報を取得します。
実際のコード
コードはこのような形になります。
import requests from bs4 import BeautifulSoup url = 'https://weather.yahoo.co.jp/weather/search/?p=東京' r = requests.get(url) soup = BeautifulSoup(r.content, 'html.parser') table_tag = soup.find_all('table') # len関数でtable_tagの要素数を確認する print(len(table_tag)) # 出力結果:2
「レジャー施設」のtableタグは、このページで2つ目のtableタグなので
要素は2個目を指定します。
(1つ目のtableタグは「市区町村名」の表です。)
# table_tagの2個目の要素を指定して出力する print(table_tag[1]) # 出力結果 # <table border="1" cellpadding="3" cellspacing="0" class="yjw_table3" width="100%"> # <thead> # <tr bgcolor="#bbd0fd" class="yjS"> # <th width="40%"> <b>施設名</b> </th> # <th width="35%"><b>所在地</b></th> # ・ # ・ # ・ # </tfoot> # </table>
「レジャー施設」のtableタグの情報を指定して出力することができました。
もしも、もっといい方法が見つかったら紹介したいと思います。