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 で実行しています。
jQuery と同じように、CSS セレクタを指定して HTML 要素を取得できました。BeautifulSoup のときは、要素を絞り込む条件を辞書で指定していたので、それに比べてシンプルにコードが書けます。jQuery に慣れていれば、その知識が生かせるのもメリット。
ただ、PyQuery が依存している lxml が AppEngine で使えないので、PyQuery も AppEngine では使えません。残念すぎ。一応、Issue は投稿してあるみたいです。
- Issue 18 - googleappengine - lxml module (Feature Request) - Google App Engine - Google Project Hosting
AppEngine でスクレイピングするなら、今のところ BeautifulSoup かな。