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