
背景
構造化されたデータを読み込むことになり、そのデータが特定のURLにアクセスするとxml形式で取得できることがわかりました。
Python3をあまり知らないこともあり、同じような処理をこれからも行っていく予定なので、まとめようと思います。
HTTPクライアント
特定のURLにアクセスするためにHTTPクライアントを生成する必要があります。
私の知っている言語だとHTTPクライアントはいろんなライブラリがあったりして、それぞれ一長一短があります。Python3ではどうかなと思い、入門Python3を調べてみると、標準ライブラリurllib.requestが紹介された後に、requestsが紹介されていて、ほとんどの目的ではrequestsを使った方がウェブ開発が簡単になるようだと記載されています。わたしも倣ってrequestsを使ってみようと思います。
requestsのインストール
まずはじめにインストールする必要があります。
現在インストールされているパッケージを確認しましょう。
1 | $ docker-compose run --rm web python -m pip list |
インストールされていないようなのでインストールします。Pipfileに追記します。
1 | [[source]] |
インストールします。
1 | $ docker-compose run --rm web python -m pipenv install --system --skip-lock |
インストールされたかどうか確認します。
1 | $ docker-compose run --rm web python -m pip list |
無事インストールされました。
requestsの基本的な使い方
次に基本的な利用方法を見ていきましょう。試すだけなのでDjango Shellを利用します。
1 | $ docker-compose run --rm web python manage.py shell |
HTTPクライアントを作成し、コンテンツを取得できました。requestsはかなり直感的でわかりやすいと思います。では実際にXMLコンテンツを取得し、parseしたいと思います。
XML parserの選定
python xml parserでググるとxml.etree.ElementTreeというライブラリが出てきます。
ドキュメント: https://docs.python.org/ja/3/library/xml.etree.elementtree.html
これは標準ライブラリのようなのでインストールは不要でimportすれば利用できます。
サンプルのXMLを使って、試してみましょう。
1 | >>> import requests |
XMLのサンプルは
1 | <breakfast_menu> |
なので、正しくrootが取得できています。
また、先程のrootはイテレート可能な子ノードを持ちます。
1 | >>> for child in root: |
上から構造化データを辿っていくことが可能です。
データ構造を調査する
上記の例で言うと、foodの下の階層の要素がわからない場合はどうしたらよいでしょうか?
そう言った場合は先程のrootと同じように以下のようにすると下の階層の要素のtagがわかります。
1 | >>> foods = root.findall('food') |
そうすると、どう言ったtagを持った要素が存在するのかわかります。tagがわかればtag名でアクセス可能です。
1 | >>> foods[0].find('name').text |
まとめ
Python3でHTTPクライアントとXMLパーサを触ってみました。
HTTPクライアントのrequestsはとても利用しやすく、直感的にわかる感じのパッケージでした。今後もrequestsを利用していこうと思います。
XMLパーサについては直感的に理解するのが難しく、Elementの要素に対してアクセスするのも一苦労でした。利用しながら慣れていこうと思います。





