こんにちはますのです。
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を元に再度中身を確認する処理が出来れば良いなと…。
恐らく変更されることは無いコードだと思うので問題ないかなと。titleタグで判別してURLを取り出すしかないのかと思っていたので一意の値があると本当に助かると実感です。
次は抽出したURLを元に再度中身を確認する処理が出来れば良いなと…。
参考資料
基礎知識:【Python】Beautiful Soup を使ってブログ記事のテキストを抜き出してみる
基礎知識:図解!Python BeautifulSoupの使い方を徹底解説!(select、find、find_all、インストール、スクレイピングなど)