JSOUPを使ってHTMLをパースする


Techboosterでは、これまでXMLをパース(解析)するJSONをパース(解析)するで、Web上のコンテンツをパース(解析)する方法を紹介してきました。

今回は、JavaのHTMLパーサであるjsoupを用いてHTMLをパースする方法を紹介します。

jsoupは、HTTPのリクエストを投げるだけでDOMオブジェクトとしてHTMLを返してくれる便利なライブラリです。

jsoupのダウンロード

Jsoupの公式HPはこちら

  • ダウンロードはこちら

  • ダウンロードのページからjarファイルをダウンロードします。

    ※2012年2月23日現在では、バージョンは1.6.1でした。

    jarファイルをダウンロードしたら、プロジェクトにクラスパスを通します。
    クラスパスを通すには、プロジェクトの「プロパティ」から「Javaのビルド・パス」を選択し、「ライブラリー」タブから「外部Jar追加」からjarファイルを選択します。

    Javadocはこちら

  • データ取得

    まずはデータの取得を行います。

    データの取得には以下のように、HTTPへリクエストを飛ばし、Documentを取得します。

    ■src/JSONSampleActivity.java

    String url = "https://techbooster.org/";
    
    try {
    	Document document = Jsoup.connect(url).get();
    } catch (IOException e) {
    	e.printStackTrace();
    }
    

    4行目で、HTMLを取得したいURLにリクエストを飛ばし、Documentを取得しています。
    ここで取得したDocumentデータから、欲しいデータを抽出します。

    欲しいデータを抽出するには、以下の方法等があります。
    [table “209” not found /]

    欲しいデータによって、取得方法を変えるといいでしょう。

    DocumentクラスのgetElementsByTag()で取得したElementの内容と、Documentクラスのtitle()で取得したStringの内容は、同様のものです。
    イカの2つは同様の内容が取得されます。

    String title = document.getElementsByTag("title").text();
    //こちらでもtitleを取得できる
    String title = document.title();
    

    サンプルプログラム

    今回は、取得したデータをTextViewに出力するサンプルを作成しました。

    まず、レイアウト画面のXMLです。

    ■res/main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >
        <TextView
            android:id="@+id/textView1"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="@string/hello" />
    </LinearLayout>
    

    画面にTextViewを置いただけの単純なものです。

    次に、データ取得部分です。
    ■src/JSONSampleActivity.java

    public class JSOUPSampleActivity extends Activity {
    	/** Called when the activity is first created. */
    	@Override
    	public void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.main);
    
    		String url = "https://techbooster.org/";
    
    		try {
    			// HTMLのドキュメントを取得
    			Document document = Jsoup.connect(url).get();
    
    			// titleタグを取得
    			Elements title = document.getElementsByTag("title");
    			// こちらでもtitleを取得できる
    			// String title = document.title();
    
    			// bodyタグをIDから取得
    			Elements body = document.getElementsByTag("body");
    			// こちらでもbodyを取得できる
    			//Element body = document.body();
    
    			TextView tv = (TextView) findViewById(R.id.textView1);
    			tv.setText(title.toString() + "\n" + body.toString());
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    }
    

    12行目で指定のURLにリクエストを飛ばし、Documentを取得しています。
    今回は、TechboosterのトップページのHTMLを取得しました。

    15行目で、titleタグのタグ名を指定して取得しています。

    20行目で、bodyタグのIDを指定して取得しています。
    22行目のように、bodyタグもtitleタグ同様、Documentクラスのbodyメソッドで取得することができます。

    以上のプログラムを実行すると、次の図のようになります。