Sun, 29 Oct 2006

pythonでスクレイピング

を見て、pythonでもElementTreeを使ったらできるんじゃないかなと思ったけども、 ちゃんとしたXMLじゃないとparse時にエラーになってしまう。じゃあ、ElementTreeに 渡す前にHTMLをXHTMLに変換したらいいのかと思って標準ライブラリを探すも、どうや ら標準でそういうことをするライブラリはないらしい。googleさんにお尋ねしてみた所 下記のエントリを発見。

まさに同じような悩みで色々探していらっしゃって、ここでBeautifulSoupを知りまし た。結構昔からあったモジュールみたい。

で、secondlifeさんの所で例に上がってたHTMLデータでHTML->XHTMLに変換してから ElementTreeに突っ込んでみたんだけどやっぱりパースエラーになってしまう。 困ったなーと思いながら、BeautifulSoupのドキュメントをもうちょっと読んでたら BeautifulSoup自体でHTMLやらCSSのタグや要素を指定してできるらしい。

名前、ふりがな、カテゴリ、URL一覧を抜き出すコードは以下のように書ける。

import urllib
from BeautifulSoup import BeautifulSoup

URL='http://d.hatena.ne.jp/keyword/%BA%B0%CC%EE%A4%A2%A4%B5%C8%FE'

b = BeautifulSoup(urllib.urlopen(URL))

data = {'name'    : b.find('span', 'title').a.string,       #名前
        'furigana': b.find('span', 'furigana').string,      #ふりがな
        'category': b.find('ul','list-circle').li.a.string} #カテゴリ

# URL一覧 : もうちょっと美しく書けるんじゃないかな・・?
urls = []
for i in b.findAll('a'):
    try:
        if i.attrs[0][0] == 'href':
            urls.append(i.attrs[0][1])
    except IndexError:
        continue

これは素晴らしい!これまでちまちまと正規表現やらHTMLParserやらでやってたのはな んだったんだろうという気にさせられる。