jqueryみたいに、htmlを操作できるJavaのライブラリ「jsoup」の使い方。

このエントリーは、タイトル通り、JavaのHTMLパーサーの「jsoup」の使い方。

感想

これから、使用していこうと思う。

  • jQuery-likeということで、使い方がわかりやすい。
  • 公式サイトの説明がわかりやすい気がする・・・。
  • 何やら、現在(最新版は3ヶ月前)も開発やらサポートをしてるみたい。トップページをみたら、「バグがあったら、報告してくれよな!」って書いてる。

※他のJavaのhtmlパーサーについては、HTML Parser、Jericho HTML Parser、Java Mozilla Html Parserとかあるけど、どれも開発がとまっているみたいだ。(安定版だから?)

jsoupとは

Jquery の様な感じで、htmlを操作できるJavaのライブラリ。
オープンソース

公式のindexページ

http://jsoup.org/

ダウンロード

http://jsoup.org/download

インストール

jsoup-1.4.1.jarをクラスパスに通す。

ソースを見たければ、クラスパスに通したjarに、以下のjarを添付する。
jsoup-1.4.1-sources.jar

Javadoc

http://jsoup.org/apidocs/

公式サイトのサンプルを見て、以下の2種類のコードを書きました。
  1. javascriptっぽく操作したコード。(getElementByIdとか使った)
  2. セレクタ構文なるもののコード(初めて知った。こちらの方が①よりも正確に取れるみたい)

解析対象のページ

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 
<html> 
 <head>
 <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  <title>Jsoup サンプル html</title> 
  <meta name="keywords" content="" /> 
  <meta name="description" content="" /> 
 </head>
 <body>
    <div id="menuLink"> 
     <ul> 
      <li class="class1"><a href="http://it-tech-dm.appspot.com/jsoup/Jsoup4">戻る</a></li> 
      <li class="class2"><a href="http://www.google.co.jp/">Google</a></li>

      <li class="class2"><a href="http://yahoo.co.jp">Yahoo</a></li> 
      <li class="class3"><a href="http://jp.msn.com/">MSN</a></li> 
      <li class="class3"><a href="http://www.atmarkit.co.jp/">@IT atmarkIT</a></li> 
      <li class="class3"><a href="http://www.taylorswift.com/">テイラースウィフト</a></li> 
      <li class="gaga"><a href="http://www.ladygaga.com/default.aspx">au IS03の人</a></li>
     </ul> 
    </div>
    <ul>
    	<li><a href="http://www.ikimonogakari.com/"><span style="color:red;">いきものがかり</span></a></li>

    	<li><a href="http://www.2ch.net/">2ちゃんねる</a></li>
    </ul>
 </body>
</html>
  1. javascriptっぽく操作したコード。(getElementByIdとか使った)

結果:http://it-tech-dm.appspot.com/jsoup/jsoup4

public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		res.setContentType("text/html; charset=UTF-8");
		
		PrintWriter out = res.getWriter();
		String url = "http://it-tech-dm.appspot.com/jsoup/sample.html";
		try {
			Document doc = Jsoup.connect(url).get();
			//aタグをすべて取得
			Elements aTags = doc.getElementsByTag("a");
			JsoupUtil.setMenu(res);
			for (Element aTag:aTags) {
				//aタグのテキスト
				out.println("aTag.text():" + aTag.text());
				out.println("<br />");
				//aタグのテキストに、任意の文字を加える
				out.println("aTag.appendText():" + aTag.appendText(":有名なサイトだよね!"));
				out.println("<br />");
				//aタグのhtmlを取得
				out.println("aTag.html():" + aTag.html());
				out.println("<br />");
				//aタグのhref属性を取得
				out.println(" aTag.attr(\"href\"):" + aTag.attr("href"));
				out.println("<hr />");
			}
			
		}catch (IOException e) {
			e.printStackTrace();
		}
	}

2.セレクタ構文なるもののコード
結果:http://it-tech-dm.appspot.com/jsoup/jsoup5

	public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		res.setContentType("text/html; charset=UTF-8");
		
		PrintWriter out = res.getWriter();
		String url = "http://it-tech-dm.appspot.com/jsoup/sample.html";
		try {
			Document doc = Jsoup.connect(url).get();
			//div id 「menuLink」のulタグのliタグを取得
			Elements liTags = doc.select("div#menuLink ul li");
			JsoupUtil.setMenu(res);
			for (Element liTag:liTags) {
				out.println(liTag.text());
				out.println("<br />");
			}
			
		}catch (IOException e) {
			e.printStackTrace();
		}
	}