読者です 読者をやめる 読者になる 読者になる

from __future__ import with_statement

Python

前日のエントリで書いた、はてなダイアリーキーワードの情報取得コードをPython2.5で書き直してみました。
with_statementにはまだ違和感がありますが、「リソースの取得・解放」、「リソースを使って何かを行う」コードを分離できるのは非常に魅力的です。
GvRとその仲間たちのセンスには、いつもながら脱帽です。

from __future__ import with_statement
from libxml2 import *

class HTMLManager(object):
    def __init__(self, url, encoding = None):
        self.input = htmlReadFile(
                url,
                encoding,
                HTML_PARSE_RECOVER|
                HTML_PARSE_NOERROR|
                HTML_PARSE_NOWARNING
            )
    def __enter__(self):
        return self.input.xpathNewContext().xpathEvalExpression
    def __exit__(self, type, value, traceback):
        if type is None:
            self.input.freeDoc()

url = 'http://d.hatena.ne.jp/keyword/%A5%D9%A5%AC%A5%EB%A5%BF%C0%E7%C2%E6'
result = {}
with HTMLManager(url) as xpath:
    [result.update([b(xpath(a)) for a, b in (
        (
         "//span[@class='title']",
         lambda x: ('title', x[0].content)
        ),
        (
         "//span[@class='title']/a[1]",
         lambda x: ('url', x[0].prop('href'))
        ),
        (
         "//span[@class='furigana']",
         lambda x: ('furigana', x[0].content)
        ),
        (
         "//ul[@class='list-circle']/li[1]/a",
         lambda x: ('category', x[0].content)
        )
    )])]
print result