javascriptライクにdomを操作できるJavaライブラリ「jsoup」

Java使ってツールみたいなものを作るとき、
httpでアクセスすること自体は簡単にできるけど肝心のhtmlがうまく扱えないってことがあった。
で、いいものがないか調べてみると「jsoup」というライブラリがあるのを知ったので使ってみようと思う。

jsoup Java HTML Parser, with best of DOM, CSS, and jquery


使い方がとっても簡単。
というのは、htmlのコーディングで見慣れたメソッドばかり。

例えば、

getElementById(String id)
getElementsByTag(String tag) //Nameが無いけど。
getElementsByClass(String className) //Nameが無いけど。

とか、

attr(String key) 
text() 
html() 

などはjQueryそのまま。

あと、特徴的なものとしてjQueryのselectorみたいなものも実装してる!
"#idName"とか".className"とか"td:gt(1)"とか

	long start = System.nanoTime();
	Document document = Jsoup.connect("http://www.nicovideo.jp/ranking/fav/daily/imas").get();

	Elements spans = document.select("span[style=color:#C00;]");
	System.out.println(spans.size());
	for(Element span  : spans) {

		Element div = span.parent().parent();

		System.out.println(div.html());
		System.out.println("-----------------------------------------------------------------");

	}

	long time = System.nanoTime() - start;
	System.err.println("execute: "+time/1000000d+"msec.");

上は、ニコニコ動画アイマスデイリーランキングの中で最近の投稿(日付が赤く表示)のものを表示してますw


あとは、アンカータグをリストアップしてみたり

	long start = System.nanoTime();
	Document document = Jsoup.connect("http://www.nicovideo.jp/ranking/fav/daily/imas").get();

	Elements elements = document.getElementsByTag("a");
	AnchorList list = new AnchorList(null);

	for( Element element  : elements) {

		list.add(new Anchor(element.attr("href"), element.html()));
	}

	System.out.println(list.toString().replace(',','\n'));

	long time = System.nanoTime() - start;
	System.err.println("execute: "+time/1000000d+"msec.");

AnchorListとAnchorは自作のクラスです・・・。


ちなみに、アンカータグをリストアップするプログラムの実行速度ですが
自分でInputStreamを一文字ずつ読んでアンカータグを抜き出したのと比較すると、

自作
execute: 329.89493msec.
memory: 24257.832KBytes

jsoup
execute: 751.655096msec.
memory: 26993.248KBytes

※memoryは実行終了時の使用中ヒープサイズ(あてにならないかも)

まぁ、ちょっとは違いますが手間を考えるとjsoup使いたくなる。。。
かかってる時間のほとんどがDOMを構築する処理みたいなので、
その後にたくさん処理することがあるのならやっぱりjsoup使う方が良いw
上の例でselectにかかってる時間は70msec.程度。


DOMを操作するメソッドも用意してあるのでファイルから読み込んでそれを弄るなんてことも出来るみたい。
あと、1からhtmlを作ることも可能っぽい。

	Document document = Document.createShell("test");
	document.title("TestTitle");
	document.body().appendElement("h1").text("Hello World");

	System.out.println(document);

結果:

<html>
 <head>
  <title>TestTitle</title>
 </head>
 <body>
  <h1>Hello World</h1>
 </body>
</html>

結構新しめのライブラリで、html5も対応してるみたいなので新しいタグもちゃんと認識するみたい。


どうでもいいけど、jsoupのAPIリファレンス綺麗だな。
Java本家もOracleになってJDK7でナウっぽくしたみたいだけどちょっと見辛くない?w