Kの備忘録(仮)

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

【Python学習中】 スクレイピング実践 表のデータをcsvファイルに保存する方法1

スクレイピングした表のデータをcsvに保存する方法を説明していきます。
今回は、必要な情報の取得を行います。

◆目次◆

今回の スクレイピングのお題

Yahoo! Japan 天気・災害」のトップページの検索窓で「東京」した結果の画面
https://weather.yahoo.co.jp/weather/search/?p=東京」の
「市区町村の表」のtableタグの
「市区町村名」と「市区町村名のリンク」の情報を取得します。

f:id:lbibouroku:20210606215928p:plain

なお、以下の記事で「市区町村の表」のtableタグの情報の取得方法は説明していますので、今回は詳細の説明は割愛します。
【Python学習中】 スクレイピング実践 Requestsモジュールとbeautifulsoup4モジュール1 - Kの備忘録(仮)
【Python学習中】 スクレイピング実践 Requestsモジュールとbeautifulsoup4モジュール2 - Kの備忘録(仮)

手順1

https://weather.yahoo.co.jp/weather/search/?p=東京」の
市区町村の表のtableタグの情報を取得する

手順2

tableタグの情報から 「市区町村名」はtdタグのテキスト情報を、
「市区町村名のリンク」はaタグのherf情報を取得する。

手順3

リストに「市区町村名」と「市区町村名のリンク」を格納する。

実際のコード

from bs4 import BeautifulSoup
import requests

url = 'https://weather.yahoo.co.jp/weather/search/?p=東京'
r = requests.get(url)
soup = BeautifulSoup(r.text, 'html.parser')

# 市区町村の表のidは「#rsltmuni 」
# 変数city_tableに「id = #rsltmuni」のtabelタグを格納する
# 変数city_cellsに「id = #rsltmuni」のtabelタグの中にある、すべてのtdタグを格納する(リスト型)
city_table = soup.select_one('#rsltmuni table')
city_cells = city_table.find_all('td')

# 変数city_list に要素なし(空)のリストを格納する
city_list = []

# 変数city_cellsに対してforを使って以下の処理を行う
#  1. 変数city_nameにtdタグのテキスト情報を格納する
#  2. 変数city_linkにaタグのherf情報を格納する
#  3. 変数cityに1と2を辞書型でそれぞれ格納する
#   (辞書はのキーは、表の見出し名にする)
for city_cell in city_cells:  
    city_name = city_cell.text
    city_link = city_cell.find('a').get('href')
    
    city = {
            '市区町村名': city_name,
            'リンク': city_link,
            }
    city_list.append(city)

ちなみに、 変数city_listの中身を一行ずつ出力すると、以下のようになります。

for i in city_list:
    print(i)

# 出力結果
# {'市区町村名': '東京都新宿区', 'リンク': 'https://weather.yahoo.co.jp/weather/13/4410/13104.html'}
# {'市区町村名': '東京都港区', 'リンク': 'https://weather.yahoo.co.jp/weather/13/4410/13103.html'}
# ・
# ・
# ・
# {'市区町村名': '東京都江東区', 'リンク': 'https://weather.yahoo.co.jp/weather/13/4410/13108.html'}
# {'市区町村名': '東京都練馬区', 'リンク': 'https://weather.yahoo.co.jp/weather/13/4410/13120.html'}

これで必要な情報を取得できました。
次回はこの情報を表形式にしてcsv保存します。