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を扱うときは、 parser を etree.HTMLParser にしてあげれば良いよ。
- Posted at:
- 2007/11/11 19:48:07
- 2 Comments
- 1 TrackBack
- 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試してみたくらいです.
とぅいまてん!
nobu
まだちょっとしか触ってないけどもlxmlは良いっすよー。
xmlとかhtmlとかパースしてゴニョゴニョするなら、
入れといて損はないっぽいっす。