76
67

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PythonでXMLをパースする

Last updated at Posted at 2016-09-04

個人的な作業用です。

総務省APIなんかではXMLでレスポンスを取得できます。このXMLを解析する方法をまとめておきます。週明け時間が空いた時に仕事で使う予定。
総務省APIのサンプルコードに社会・人口統計を取得する方法が書いてありまして、叩くと以下の様なXMLが返ってきます。

<?xml version="1.0" encoding="UTF-8" standalone="true"?>
<GET_STATS_DATA xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://api.e-stat.go.jp/rest/2.0/schema/GetStatsData.xsd">
<RESULT>
<STATUS>0</STATUS>
<ERROR_MSG>正常に終了しました。</ERROR_MSG>
<DATE>2016-09-04T21:28:09.920+09:00</DATE>
</RESULT>
<PARAMETER>
<LANG>J</LANG>
<STATS_DATA_ID>C0020050213000</STATS_DATA_ID>
<NARROWING_COND>
<CODE_CAT01_SELECT>#A03503</CODE_CAT01_SELECT>
</NARROWING_COND>
<DATA_FORMAT>X</DATA_FORMAT>
以下省略

これをurllibモジュールを使って取得してきて、xmlモジュールを使って要素にアクセスするという感じ。古いAPIだとJSON出力ない場合もあるので。

APIから取り込み

これはいろんなところに書いてありますし、公式ドキュメント見たら色々書いてあります。総務省APIのエンドポイントURLを使いますが、アプリケーションIDとかはログインして取得してください。

import urllib

url = 'http://api.e-stat.go.jp/rest/2.0/app/XXXXXXXXXXXX'
req = urllib.request.Request(url)

with urllib.request.urlopen(req) as response:
    XmlData = response.read()

これでXmlDataにXMLのテキストデータが格納されます。

XMLの解析

XMLモジュールをインポートして解析開始。これも公式ドキュメントに詳しく書いてあります。

import xml.etree.ElementTree as ET

root = ET.fromstring(XmlData)

これだけ。

要素の中身を見てみる

# 最上位階層のタグと中身
print(root.tag,root.attrib)

# 子階層のタグと中身
for child in root:
    print(child.tag, child.attrib)

孫要素まで入れたいのならリストやディクショナリ作って書き込むのがいいんですかね。

要素へのアクセス

リストへのアクセスなんかと同じ感じ。

print(root[0][1].text)

とりあえずやりたいことはこれでできそう。

76
67
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
76
67

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?