2013/09/03

ライブラリ:lxml.etree

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

import lxml.etree

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

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

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

01 インスタンスの作成

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の場合はコンパイラの設定などがややこしいので、有志で作られているインストーラを使いました。Windowsはこちらが手早いかと思います。
lxml 2.3 - PyPI
lxml - Unofficial Windows Binaries for Python Extension Packages


etreeのほかにも、lxmlにはさまざまな便利なサブモジュールがあるようですので、詳しくは公式ドキュメントをごらんください。


参考
lxml - XML and HTML with Python
lxml - PyPI
lxml 2.3 - PyPI
lxml - Unofficial Windows Binaries for Python Extension Packages

0 件のコメント: