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

    1
    2
    3
    4
    5
    6
    7
    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つは同様の内容が取得されます。

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

    サンプルプログラム

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

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

    ■res/main.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    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メソッドで取得することができます。

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