lxmlメモ

HTMLパースするときにはlxml.htmlを使う

etree.parse(url, etree.HTMLParser())みたいにParser明示的に書かなくてもOKだし、便利なメソッドも使える。

etree.parse(URL)と書かず、自分でurlopen & decode

parse(URL)と短く書けるようになってるけど、UTF-8じゃないページだと文字化けすることが多かったので事前にdecodeが吉。
でもこうすると自分でbase_url指定しないとmake_links_absolute()が使えないので注意。

実験

はてなブックマークからリンク先(絶対パス)とリンクテキスト抽出の例。
lxml.etree使うようにしてみたり、parse(URL)で書いたりしてみるとうまくいかないはず。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from lxml import html as etree
from urllib2 import urlopen
from StringIO import StringIO

url='http://b.hatena.ne.jp/'
res = urlopen(url)
html = res.read().decode(res.headers.getparam('charset'))
tree = etree.parse(StringIO(html))
tree.getroot().make_links_absolute(url)
for a in tree.xpath('//a[@href and text()]'):
    print "%s [URL:%s]" %  (a.text_content().strip(), a.attrib.get('href').strip())

書いたことはすべて推奨されているやりかたではないかもしれないので、注意。