ライブラリ: lxml.etree

Pythonの lxml.etree というライブラリについてご紹介します。

import lxml.etree

lxml.etree は XML 形式のデータを Python で手軽に扱えるようにするライブラリです。 XML 形式のデータがカンタンに扱えるさまざまな機能を備えています。

私は jQuery と同等の機能を提供する PyQuery というライブラリを使うのに必要だったので入れました。

以下 lxml.etree の基礎的な使い方を見ていきます。

01 インスタンスの作成

lxml.etree において主役となるのは Element と呼ばれるクラスです。

from lxml import etree

root = etree.Element("root")
print type(root).__name__  # _Elementと表示
print root.tag

Element() に文字列を渡せば、その名前の Element インスタンスを作ることができます。

その要素のタグには tag というアトリビュートでアクセスできます。

02 子要素の追加

child1 = etree.SubElement(root, "child1")
root.append(etree.Element("child2"))
root.insert(0, etree.Element("child3"))
print etree.tostring(root, pretty_print=True)
# 次のとおり表示
# <root>
#   <child3/>
#   <child1/>
#   <child2/>
# </root>

子要素を追加するには SubElement() append() insert() といったメソッドを使います。 SubElement はインスタンス生成時に親を特定して作るもので、 append()insert() は、親要素のメソッドとして呼び出し、子要素を引数に受け取る形で使います。

append()insert()list のメソッドと同じ使い方で使うことができます。

特定の要素を子要素も含めて整形して表示するには etree.tostring() を使います。

03 テキストとコメント要素

child4 = etree.SubElement(root, "child4")
child4.text = "this is text"
root.append(etree.Comment("comment part"))
print etree.tostring(root, pretty_print=True)
# 次のとおり表示
# <root>
#   <child3/>
#   <child1/>
#   <child2/>
#   <child4>this is text</child4>
#   <!--comment part-->
# </root>

要素内のテキストには text アトリビュートを使ってアクセスすることができます。

コメント要素を表すクラスとして Comment があります。こちらも Element と同じく他の要素の子要素とすることができます。

04 子要素へのアクセス

print root[0].tag  #
print len(root)  # 5
print root.index(root[2])  # 2

子要素にはインデックスを使ってアクセスできます。

children = list(root)
for c in children:
    print c.tag
# 次のとおり表示
# child3
# child1
# child2
# child

Element を関数 list() に渡すとその子要素のリストを作ることができます。

05 属性値へのアクセス

root.set("hello", "world")
root.set("dog", "taro")
a = root.attrib
print a  # {'hello': 'world', 'dog': 'taro'}
print a.get("dog")  # taro

属性値には set() get() でアクセスできます。また、属性値のセットを辞書として取得するにはattribアトリビュートを使います。

06 要素間の移動

print root[1].getnext().tag  # child2
print root[1].getprevious().tag  # child3
print root == root[1].getparent()  # True

要素間の移動をするためのメソッドとして getnext() getprevious() getparent() などが用意されています。

以上です。

インストール

ソースからインストールする場合は pip や GitHub で インストールするようです。

私は主に Windows で使っているのですが、 Windows の場合はコンパイラの設定などがややこしいので、有志で作られているインストーラを使わせていただきました。

lxml には etree のほかにも、さまざまな便利なサブモジュールがあります。興味のある方は公式ドキュメントをご覧ください。

参考