こんにちわ、Python大好きオオバです。

前回記事からの続きです。
最低限の機械学習の知識を手に入れるため勉強中。

本書全7章中3章目に入りました。
様々なデータ形式をパースするというテーマのチャプターっぽいです。
初回はXML。

防災関連データ 横浜市

【今回の処理フロー】

  1. 避難施設XMLをローカルにダウンロード
  2. ダウンロードしたXMLをBeautifulSoupでパース
  3. BeautifulSoupから指定要素を取り出す

1. 避難施設XMLをローカルにダウンロード

urllib.request.urlretrieve("URL", "保存するファイル名")  

urlretrieveメソッドを使ってファイルをダウンロードします。

2. ダウンロードしたXMLをBeautifulSoupでパース

xml = open("保存するファイル名", "r", encoding="utf-8").read()  
soup = BeautifulSoup(xml, 'html.parser')  

open関数でダウンロードしたxmlをメモリに乗せ、BeautifulSoupでxmlをパースします。

3. BeautifulSoupから指定要素を取り出す

今回ダウンロードしたxmlは以下のような構造になっています。


  生麦小学校  
  鶴見区  
  生麦四丁目15番1号  
  被災した住民の避難生活の場所、情報受伝達、備蓄機能を備えた拠点です。  


  豊岡小学校  
  鶴見区  
  豊岡町27番地1  
  被災した住民の避難生活の場所、情報受伝達、備蓄機能を備えた拠点です。  

・・・  

以下のように複数要素あるshelterfind_all関数で配列取得し、単一要素はfind関数を使います。

info = {}  
for obj in soup.find_all("shelter"):  
    name = obj.find('name').string  
    ward = obj.find('ward').string  
    if not (ward in info):  
        info[ward] = []  
    info[ward].append(name)  

最後に今回のサンプルコードです。

xmlparse.py · GitHub

このコードを実行すると以下のように出力されます。

+ 鶴見区  
| - 生麦小学校  
| - 豊岡小学校  
| - 鶴見小学校  
| - 潮田小学校  
| - 下野谷小学校  
| - 市場小学校  
| - 平安小学校  
| - 末吉小学校  
| - 上末吉小学校  

BeautifulSoupを使うとxmlパースは簡単ですね。

最後に

XML、JSON、YAML、csv、Excel辺りのパースをこの3章ではパースするそうです。次回まとめてやります。

オススメ記事
2021秋 Asset Refreshセール
100以上のアセットがなんと50%OFF!!オオバもいくつか買いました!
期間 : 10月2日午後3時59分まで
検証環境