2012年9月6日

pyquery で XML の namespace を扱う

概要

pyquery は XML を JQuery のように処理するこができる。
XML の namespace も処理することができる。

処理するXML

pypi は 各パッケージに DOAP(Description of a Project) が提供されているので、サンプルとしてこれを処理する。
pyquery 1.2.1 の DOAP は http://pypi.python.org/pypi?:action=doap&name=pyquery&version=1.2.1になる。

DOAP の形式確認

DOAP は RDF で、pypi の DOAP は以下のような形式になっている。

<?xml version="1.0" encoding="UTF-8" ?>
<rdf:RDF xmlns="http://usefulinc.com/ns/doap#"
         xmlns:foaf="http://xmlns.com/foaf/0.1/"
         xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<Project>
<name></name>
<shortdesc></shortdesc>
<description></description>
<homepage></<homepage>
<maintainer>
<foaf:Person>
<foaf:name></foaf:name>
<foaf:mbox_sha1sum></foaf:mbox_sha1sum>
</foaf:Person>
</maintainer>
<release><Version><revision></revision></Version></release>
</Project></rdf:RDF>

サンプル

revisionの中身を取るには以下のようにする。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from pyquery import PyQuery as pq


def main():
    url = 'http://pypi.python.org/pypi?:action=doap&name=pyquery&version=1.2.1'

    # namespace
    namespaces = {"ns": "http://usefulinc.com/ns/doap#"}
    # pyquery
    query = pq(url, parser='xml')

    # revision の取得
    revision = query('ns|revision',
                     namespaces=namespaces).text()

    print revision


if __name__ == '__main__':
    main()

どうやって調べるのか

Python 系のパッケージはだいたいテストソースが付いている。
pyquery のテストソースには namespace の処理例が書いてある。
namespace の処理以外にも pyquery で可能な処理がほとんど書いてあるので、テストソースを読むと大体の事は解決する。

blog comments powered by Disqus