「Java」 HTML パーサライブラリ jsoup を使ってみた
ウェブスクレイピングしたかったので、Java から使える HTML パーサをいろいろ調べてみてました。
その中で jsoup というライブラリがあって、こいつがなかなかいい感じだったので、ちょっとしたメモ残しておきます ( 結構 web にも情報多そうです )。
・jsoup Java HTML Parser, with best of DOM, CSS, and jquery
http://jsoup.org/
URL から HTML 取得できるみたいで ( ファイルでも、String でも OK みたい )、また、CSS のセレクタ的なのも使えるみたいです。
以下、動作確認の結果を。
「http://www.example.com」の HTML を対象にしました。
<!doctype html> <html> <head> <title>Example Domain</title> <meta charset="utf-8" /> <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <style type="text/css"> body { background-color: #f0f0f2; margin: 0; padding: 0; font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; } div { width: 600px; margin: 5em auto; padding: 50px; background-color: #fff; border-radius: 1em; } a:link, a:visited { color: #38488f; text-decoration: none; } @media (max-width: 700px) { body { background-color: #fff; } div { width: auto; margin: 0 auto; border-radius: 0; padding: 1em; } } </style> </head> <body> <div> <h1>Example Domain</h1> <p>This domain is established to be used for illustrative examples in documents. You may use this domain in examples without prior coordination or asking for permission.</p> <p><a href="http://www.iana.org/domains/example">More information...</a></p> </div> </body> </html>
例えば、上記から h1 要素のデータを取る場合のコードは以下の感じになります。
private void test1() throws Exception { Document doc = Jsoup.connect("http://www.example.com").get(); Elements newsHeadlines = doc.select("h1"); System.out.println(newsHeadlines.text()); }
o 実行結果
Example Domain
toString() 呼び出すと要素ごと取れる。
System.out.println(newsHeadlines.toString());
o 実行結果
<h1>Example Domain</h1>
select の引数に div と渡すと div 要素内の h1 やら p やらの要素も取得できる。
private void test1() throws Exception { Document doc = Jsoup.connect("http://www.example.com").get(); Elements newsHeadlines = doc.select("div"); System.out.println(newsHeadlines.toString()); }
o 実行結果
<div> <h1>Example Domain</h1> <p>This domain is established to be used for illustrative examples in documents. You may use this domain in examples without prior coordination or asking for permission.</p> <p><a href="http://www.iana.org/domains/example">More information...</a></p> </div>
p 要素内の a 要素を取りたいって場合は select の引数に "p a" と渡してやればいい。
Elements newsHeadlines = doc.select("p a");
o 実行結果
<a href="http://www.iana.org/domains/example">More information...</a>
上記の HTML には無いんだけど、例えば「"aaa" という値の class 属性持つ div 要素」であれば、"div.aaa" を渡してやれば取れる。
Elements newsHeadlines = doc.select("div.aaa");
とっても使いやすいですね。以上です。
Maven Repository は以下です。
・Maven Repository: org.jsoup » jsoup
http://mvnrepository.com/artifact/org.jsoup/jsoup/