PyQuery で再びスクレイピング入門

Pythonスクレイピングするときに便利なライブラリで、BeautifulSoup の他によく見かけるのが PyQuery。名前から想像つくと思いますが、HTML を jQuery と同じ感覚で操作できるライブラリです。


前回、BeautifulSoup を使ってはじめてのスクレイピングに挑戦しました。

スクレイピングの練習がこれで終わり、というのは味気ない気がします。PyQuery と使い比べてみましょうか。


PyQuery を easy_install でインストールします。次のコマンドを実行すると、PyQuery が依存している lxml もインストールされます。

easy_install pyquery


今回もクックパッドのレシピから情報を抽出してみます。

# -*- coding:utf-8 -*-

from urllib import request
from pyquery import PyQuery as pq

resp = request.urlopen("http://cookpad.com/recipe/1069312")
html = resp.read().decode("utf-8")
query = pq(html)

results = []

# レシピのメイン部を取得
for recipe_main in query.find("div#recipe-main"):
    # レシピのタイトルを取得
    for recipe_title in pq(recipe_main).find("h1.recipe-title"):
        results.append(pq(recipe_title).text())

    # 材料を取得
    for ingredient in pq(recipe_main).find("div.ingredient_name"):
        results.append(pq(ingredient).text())

# 結果を表示
for r in results:
    print(r)

実行結果がこちら。今回は IDLE で実行しています。
f:id:griefworker:20110602211336p:image
jQuery と同じように、CSS セレクタを指定して HTML 要素を取得できました。BeautifulSoup のときは、要素を絞り込む条件を辞書で指定していたので、それに比べてシンプルにコードが書けます。jQuery に慣れていれば、その知識が生かせるのもメリット。


ただ、PyQuery が依存している lxml が AppEngine で使えないので、PyQuery も AppEngine では使えません。残念すぎ。一応、Issue は投稿してあるみたいです。


AppEngine でスクレイピングするなら、今のところ BeautifulSoup かな。