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())
書いたことはすべて推奨されているやりかたではないかもしれないので、注意。