No Programming, No Life

プログラミング関連の話題や雑記

Groovyでスクレイピングしてみる(NekoHTML編)

Groovyでスクレイピングしてみる - No Programming, No Life
の続き。


前回は取得したHTMLの内容を正規表現で解析していましたが、JavaのライブラリでNekoMTMLというのがあるらしく*1、それを使うと曖昧なHTMLをいい感じに解析してくれるようです。GroovyのXmlSlurperでラップするだけですぐに使用できるので簡単です。

準備

  1. 本家からアーカイブを取得してくる。*2
  2. 適当な場所に解凍
  3. 解凍した中から、nekohtml.jarxercesImpl.jar をクラスパスの通った場所へコピー*3
  4. ちなみに、xercesImpl.jar は .\lib\xerces-2.9.1 にあったものを利用しました

動作サンプルソース

前回と同様、はてなハイクの最新エントリページをスクレイピングしてみます。
(動作確認: Groovy Version: 1.6.2 JVM: 1.6.0_13)

// need "nekohtml.jar" and "xercesImpl.jar"

/*
 * はてなハイクのトップページ(http://h.hatena.ne.jp/)にアクセスし
 * 最新のエントリを投稿したユーザIDを取得し、そのユーザのプロフィールの
 * URLを標準出力へ出力する。
 */
import org.cyberneko.html.parsers.SAXParser

def parser = new XmlSlurper(new SAXParser()) // ラッピング
def HTML = parser.parse("http://h.hatena.ne.jp/")
def userIDs = HTML.'**'.findAll{
    it.name() == 'SPAN' && it.@class == 'username' // <SPAN class="username">
}.collect{ it.A.text() } // A要素の値
userIDs.each{ id -> println "http://www.hatena.ne.jp/${id}/" }

簡単ですね!応用次第でいろいろ出来そうですね。これは強力。

メモ

ドキュメントを詳しく読んでなんでよく分からないんですが、解析した結果、HTMLタグは大文字になるみたいです。*4

参照

NekoHTML

*1:猫好きの私としてはとてもいい名前のライブラリだと思う。

*2:執筆時の最新バージョンはv1.9.12でした。

*3:私は面倒なので、C:\Documents and Settings\${ユーザ名}\.groovy\libに置きました。

*4:HTML とか A とか SPAN とかになってます。