【メモ】Beautiful SoupのWebスクレイピングで特定の文字列を含むテキストデータを出力する

  • 2022年3月3日
  • 2022年3月2日
  • IT, Python

こんにちはますのです。

BCP試験の一環で安否確認メールのシステムを利用しています。
使っていて思うことはただひとつ。

被災している時にメール見ないよね?
Slack使ってればSlackに送られた方がイイヨネ?

無駄にシステム使うくらいなら内製で出来ないかと調べています。

現在はPythonで気象庁のxmlデータから地震速報を引っ張って来れないかと頑張っていますのでその備忘録です。
もし完成したらちゃんと記事に出来ればなと。

地震速報の詳細が記載されているURLの特徴を探す

気象庁防災情報XMLフォーマット形式電文の公開(PULL型)にAtomが公開されているので利用。

中身を見てみると地震と火山情報がごっちゃになっている様子です。
しかも「タグ:id」のURLを開かないとマグニチュードの情報は出ていないみたいですね。

地震に関するURLには「VXSE」が付与されている

色々と気象庁のサイトを見ていたら地震情報については「VXSE」が付与されるようですね。

地震情報等

恐らく本番実装の時は「VXSE51」のみを検索条件とすると思いますが、今回はさくっと「VXSE」で設定します。
VXSE51は現時点で流れてきていないのでテストは気象庁のサンプルデータを利用することになりそうです。

気象庁のAtomデータから「VXSE」が含まれるURLのみ抽出する

では実際に抽出を試してみましょう。

正規表現モジュール「re」を利用して「~を含む」条件を実現しました。

import re
import requests
from bs4 import BeautifulSoup

# スクレイピング対象のURLにリクエストを送りを取得する
res = requests.get('https://www.data.jma.go.jp/developer/xml/feed/eqvol.xml')

# レスポンスのから BeautifulSoup オブジェクトを作る
soup = BeautifulSoup(res.content, 'html.parser')

search = re.compile('.*VXSE.*')
print(soup.find_all(text=search))

実行結果で見事にVXSEが含まれるテキストのみが抽出できました。

['http://www.data.jma.go.jp/developer/xml/data/20220302013400_0_VXSE53_010000.xml', 'http://www.data.jma.go.jp/developer/xml/data/20220302001206_0_VXSE53_010000.xml']
親要素を見に行く、兄弟要素を見に行くなどやり方を模索しましたが、xmlデータ内を見ていたら一意の値があることに気付きました。
恐らく変更されることは無いコードだと思うので問題ないかなと。titleタグで判別してURLを取り出すしかないのかと思っていたので一意の値があると本当に助かると実感です。
次は抽出したURLを元に再度中身を確認する処理が出来れば良いなと…。

参考資料

基礎知識:Beautiful Soup:テキスト引数

基礎知識:【Python】Beautiful Soup を使ってブログ記事のテキストを抜き出してみる

基礎知識:図解!Python BeautifulSoupの使い方を徹底解説!(select、find、find_all、インストール、スクレイピングなど)

正規表現参考:【Python】BeautifulSoupの使い方・基本メソッド一覧|スクレイピング

気象庁サンプルデータ:気象庁防災情報XMLフォーマット 技術資料

最新情報をチェックしよう!