Kの備忘録(仮)

Python、VBA、Excelを中心に記事を投稿

【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タグの情報を取得します。
f:id:lbibouroku:20210603223240p:plain

実際のコード

コードはこのような形になります。

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タグの情報を指定して出力することができました。
もしも、もっといい方法が見つかったら紹介したいと思います。