Android
 Computer >> コンピューター >  >> プログラミング >> Android

AndroidでHTMLを解析する方法!Jsoupを使った実装手順をステップごとに解説

この記事では、AndroidアプリでHTMLを解析(パース)する方法を、人気のJavaライブラリ「Jsoup」を使ったサンプルコードとともに解説します。Webサイトのタイトルやリンク情報を取得して画面に表示するまでの一連の流れを、初心者にもわかるようにステップごとに紹介します。

HTML解析にはJsoupが便利

AndroidでHTMLを扱う場合、HTMLパーサーライブラリのJsoupを利用するのが定番です。Jsoupを使えば、URLからHTMLを取得し、CSSセレクタに近い直感的な記法で任意の要素を簡単に抽出できます。スクレイピングやWeb上のデータ取得処理を少ないコード量で実装できるのが大きな魅力です。

実装手順

ステップ1:新規プロジェクトを作成する

Android Studioを起動し、「File」→「New Project」を選択して新しいプロジェクトを作成します。必要な項目をすべて入力して、プロジェクトの雛形を生成しておきましょう。

ステップ2:レイアウトファイル(activity_main.xml)を編集する

res/layout/activity_main.xml に以下のコードを追加します。ここでは、HTML取得用のボタンと、結果を表示するためのTextViewを配置したシンプルなレイアウトを定義しています。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="12sp"
    tools:context=".MainActivity">
    <Button
        android:id="@+id/btnParseHTML"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Get website"
        android:layout_marginTop="40dp"
        android:layout_centerHorizontal="true"/>
    <TextView
        android:id="@+id/textView"
        android:text="Result"
        android:textSize="12sp"
        android:textStyle="bold"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/btnParseHTML"
        android:layout_centerHorizontal="true"/>
</RelativeLayout>

ステップ3:build.gradleに依存関係を追加する

build.gradle(Module: app)に以下の依存関係を追加します。

implementation 'org.jsoup:jsoup:1.11.2'

なお、ここではバージョン1.11.2を指定していますが、より新しいバージョンが公開されている場合は、最新版を利用するのがおすすめです。

ステップ4:MainActivity.javaを実装する

src/MainActivity.java に以下のコードを追加します。ポイントは、ネットワーク通信をメインスレッドではなく別スレッドで実行し、結果は runOnUiThread() を使ってUIスレッド側でTextViewに反映させている点です。Androidではメインスレッドでの通信が禁止されているため、この構成は必須のテクニックです。

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.IOException;
public class MainActivity extends AppCompatActivity {
    Button button;
    TextView textView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = findViewById(R.id.textView);
        button = findViewById(R.id.btnParseHTML);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                getHtmlFromWeb();
            }
        });
    }
    private void getHtmlFromWeb() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                final StringBuilder stringBuilder = new StringBuilder();
                try {
                    Document doc = Jsoup.connect("https://www.tutorialspoint.com/").get();
                    String title = doc.title();
                    Elements links = doc.select("a[href]");
                    stringBuilder.append(title).append("\n");
                    for (Element link : links) {
                        stringBuilder.append("\n").append("Link : ").append(link.attr("href")).append("\n").append("Text : ").append(link.text());
                    }
                } catch (IOException e) {
                    stringBuilder.append("Error : ").append(e.getMessage()).append("\n");
                }
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        textView.setText(stringBuilder.toString());
                    }
                });
            }
        }).start();
    }
}

このコードでは、Jsoup.connect() で対象サイトのHTMLドキュメントを取得し、doc.title() でページタイトルを、doc.select("a[href]") で全てのリンク要素を抽出しています。取得したリンクのURL(href属性)とテキストを順番にStringBuilderへ追記し、最後にまとめて画面に表示する仕組みです。

ステップ5:AndroidManifest.xmlにインターネット権限を追加する

外部サイトと通信するため、androidManifest.xml に以下のインターネットパーミッションを追加します。これを忘れると通信エラーになるので注意してください。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android" package="app.com.sample">
    <uses-permission android:name="android.permission.INTERNET" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

アプリを実行して動作を確認しよう

それでは、実際にアプリを実行してみましょう。Android端末をPCに接続し、Android Studioでプロジェクト内のアクティビティファイルを開いた状態で、ツールバーの「Run」アイコンをクリックします。実行デバイスとして自分のスマートフォンを選択すると、端末にアプリが起動します。

「Get website」ボタンをタップすると、指定したサイトのタイトルと、ページ内の全リンク(URLとテキスト)がTextViewに一覧表示されます。うまく表示されれば、HTML解析の基本処理は完成です。


  1. AndroidでJSONオブジェクトを解析する方法!RecyclerViewで一覧表示する完全ガイド

    AndroidでJSONオブジェクトを解析する方法 この記事では、AndroidアプリでJSONオブジェクトを解析(パース)し、取得したデータをRecyclerViewに一覧表示する方法を、ステップごとにわかりやすく解説します。アセットフォルダに配置したJSONファイルを読み込み、名前・メールアドレス・電話番号の情報を取り出して画面に表示するまでの一連の流れを学べるので、Android開発初心者の方にもおすすめの内容です。 手順1:新規プロジェクトを作成する まず、Android Studioを起動し、「File」→「New Project」を選択して新しいプロジェクトを作成します。必要な項

  2. AndroidでJSONを解析する方法を徹底解説!初心者向けステップバイステップガイド

    はじめに この記事では、AndroidアプリでJSONデータを解析(パース)する方法を、実際のコード例とともにわかりやすく解説します。JSONはWeb APIなどで広く利用されているデータ形式であり、Android開発においてその扱い方をマスターすることは非常に重要です。 ステップ1:新規プロジェクトの作成 まず、Android Studioで新しいプロジェクトを作成します。メニューから「File」→「New Project」を選択し、必要な項目をすべて入力してプロジェクトを作成しましょう。 ステップ2:レイアウトファイルの作成 次に、res/layout/activity_main.xm