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 | 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); 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メソッドで取得することができます。