lxmlを試してみたよ。

遅ればせながら lxml を試してみたよ。コレ、かなり便利っすなぁ。

インストールは easy_install でするのが簡単で良いと思う。 yolk で検索してみると、2.0alphaとかも出てきたので、 今回はバージョンを指定してインストールしてみた。

$ sudo easy_install lxml==1.3.6

テスト用にこんな感じのXMLを用意して、 test.xml とかで保存。

<?xml version="1.0" encoding="UTF-8"?>
<items>
    <item>
        <id>1</id>
        <name>hoge</name>
        <type>word</type>
    </item>
    <item>
        <id>2</id>
        <name>hige</name>
        <type>word</type>
    </item>
    <item>
        <id>3</id>
        <name>hage</name>
        <type>image</type>
    </item>
</items>

lxml を使って遊んでみる。

>>> from lxml import etree
>>> xml = etree.parse(open('test.xml', 'r'), parser=etree.XMLParser())
>>> xml
<etree._ElementTree object at 0x7406c0>

>>> #   ルートノード(items)を取ってくる。
>>> items = xml.getroot()
>>> items
<Element items at 7417b0>

>>> #   子要素(item)を取ってくる。
>>> items.getchildren()
[<Element item at 7417e0>, <Element item at 7418a0>, <Element item at 741840>]

>>> #   XPathで子要素(item)を取ってくる。
>>> items.xpath('./item')
[<Element item at 7417e0>, <Element item at 7418a0>, <Element item at 741840>]

>>> #   XPathで孫要素(name)のテキストを取ってくる。
>>> items.xpath('./item/name/text()')
['hoge', 'hige', 'hage']

文字列から直接パースする場合は、 etree.fromstring なメソッドを使うと良いらしい。

>>> text = open('test.xml', 'r').read()
>>> items = etree.fromstring(text, parser=etree.XMLParser())
>>> items
<Element items at 7418a0>

文字列からのパースだと、 getroot しなくても直接ルートノードが返ってくる。

逆に、ノードを文字列にしたい場合だと、 etree.tostring なメソッドを使うと良いみたい。

>>> #   itemノードの1個目を文字列に。
>>> etree.tostring(items.xpath('./item')[0])
<item>
    <id>1</id>
    <name>hoge</name>
    <type>word</type>
</item>

>>> #   最後のitemノードに含まれるnameノードを文字列に。
>>> etree.tostring(items.xpath('./item[position()=last()]/name')[0])
<name>hage</name>

色々簡単に使えていい感じ。 XPath もちゃんと覚えないとなぁ。 HTMLを扱うときは、 parseretree.HTMLParser にしてあげれば良いよ。

Posted at: 
2007/11/11 19:48:07
2 Comments
1 TrackBack
Tags: 
lxml
Python
XPath
Trackback: 
http://humming.via-kitchen.com/2007/11/11/tried-using-lxml/trackback/

TrackBacks

[Django][Python][jQuery][SQLite3][KDE][その他]巡回 - 常山日記

Blog: Django profiler Django Tip: External Database Backends Some Django tips Django Signals Vs. Custom Save()-Method Python: Python関連で気になったもの python + Weather Hacks, MSNP(1) [Dev-PyGTK]pygtkで遊ぼう(6) メニュー編 検索式を構文解析するPython

Created at: 
2007/11/12 03:03:31

Comments

ENDLESS

おっつ!
lxmlはいい感じか!問題点ってーのはないのかな!?

おじさんは,ほんのちょろっとDjangoのTest試してみたくらいです.
とぅいまてん!

Created at: 
2007/11/11 21:40:44

nobu

まだちょっとしか触ってないけどもlxmlは良いっすよー。
xmlとかhtmlとかパースしてゴニョゴニョするなら、
入れといて損はないっぽいっす。

Created at: 
2007/11/12 05:19:28

Add Comment

Add Comment