BeautifulSoupを使ってYahoo! Searchをスクレイピング

ウェブサイトのスクレイピングってだいたいすんごくツマンナイんだけど、時々どうしてもやらなきゃいけなくなるんだよね。そんな時には、 BeautifulSoup を使って楽々、スピーディーにスクレイピング!…っていつもとキャラ違います状態のbonlifeです。

(でも、Yahoo! Search だったらスクレイピングせずにAPI使えば良くね?とか思ったのはきっと私だけでしょう。)

Python の BeautifulSoup を使って、手短に書いてみました。Python不慣れな人でもなんとなく分かると思います。

import urllib2
from BeautifulSoup import BeautifulSoup

def soup2unistr(soup):
    return ''.join([e for e in soup.recursiveChildGenerator() if isinstance(e,unicode)])

results = list()

html = urllib2.urlopen('http://search.yahoo.com/search?p=Python').read()
soup = BeautifulSoup(html)
for i in soup.findAll('a',{'class':'yschttl'}):
    result = dict()
    result['title']       = soup2unistr(i)
    result['url']         = i.get('href')
    result['description'] = soup2unistr(i.parent.parent.find('div',{'class':'yschabstr'}))
    results.append(result)

print results

ここではクラスにもせずにベタ書きしちゃってます。 soup2unistr の部分が見慣れない人には気持ち悪いかもしれませんね。再帰的にタグを取り除いて、Unicode文字列にしてるだけです。 (詳細はマニュアルご参照。) description の取得部分では、親の親までさかのぼってから find とかしちゃっててややこしそうですが、慣れればなんてことはありません。XPath とか得意じゃない人にも優しい BeautifulSoup。オススメです!
今回は最後でまとめて print しちゃってますが、これだと意味不明かもしれません。ちゃんと results の要素を1個ずつ見ればなかなかナイスな仕上がりになっていますよ。また、今回は固定値で p=Python をURL末尾に付与してますが、ここを自由に変更できるようにするのも簡単ですよね。後はあなたの工夫次第! Enjoy Python :-)

[関連URL]