AndroidでHTMLを解析する


83

私はウェブページからアンドロイドでHTMLを解析しようとしていますが、ウェブページがうまく形成されていないので、私は得SAXExceptionます。

AndroidでHTMLを解析する方法はありますか?


Rhinoの依存関係により、htmlunitがAndroidでコンパイルされるのは大変だと思いますが、試してみることができます...また、スープなどの他の非厳密なHTMLパーサーも機能する可能性があります。
アレックス2010

ここでwebkitを使用できるのだろうか。
ziya 2010

回答:


71

私はちょうどこの問題に遭遇しました。いくつか試してみましたが、JSoupを使うことにしました。jarファイルは約132kで、少し大きいですが、ソースをダウンロードして、使用しないメソッドのいくつかを削除すると、それほど大きくはありません。
=>それの良いところはそれが悪い形のHTMLを処理するということです

これが彼らのサイトからの良い例です。

File input = new File("/tmp/input.html");
Document doc = Jsoup.parse(input, "UTF-8", "http://example.com/");

//http://jsoup.org/cookbook/input/load-document-from-url
//Document doc = Jsoup.connect("http://example.com/").get();

Element content = doc.getElementById("content");
Elements links = content.getElementsByTag("a");
for (Element link : links) {
  String linkHref = link.attr("href");
  String linkText = link.text();
}

1
完全なjarを含めて、本番リリースのアプリでProGuardを実行して、未使用のコードを取り除くことができます。
アンドリューマッケンジー

3
注意:JSoupは非常に遅いです。
ケビン2014

@kevinその主張の情報源?一部のデバッグが有効になっている可能性があります。
goetzc 2016

クライアント側でのhtmlページのレンダリング中にJavaスクリプトを使用して動的にロードされたコンテンツはどうですか?Jsoupはこのコンテンツも表示しますか?
MikeL 2016年

56

Html.fromHtml(source)を使用してみましたか?

クラスはソースの品質に関してかなり寛大だと思います(内部ではTagSoupを使用していますが、これは実際の悪いHTMLを念頭に置いて設計されています)。ただし、すべてのHTMLタグをサポートしているわけではありませんが、理解できないタグに反応するように実装できるハンドラーが付属しています。


1
これは非常に単純で、正確なもの(XPATHなど)を検索できません

ご注目下さい。これにより、「すべてのスレッドが一時停止」されます。html形式のテキストを含むjsonを取得するときよりも直面します。htmlテキストを正しく表示することに問題はありませんでしたが、html.fromhtml()を使用した後、私はこれに直面します。
デビッド

23
String tmpHtml = "<html>a whole bunch of html stuff</html>";
String htmlTextStr = Html.fromHtml(tmpHtml).toString();

素晴らしくてシンプルで、プラグインはありません。tnxs
RonEskinder 2015

1
注:から返さtoString()れたSpannedオブジェクトを呼び出すHtml.fromHtml(str)と、HTMLタグの多くが機能しなくなります(を含む<i> <u> <b>)。あなたがのTextViewを設定している場合は、これだけの操作を行います。myTextView.setText(Html.fromHtml(str))
Sakiboy

@Sakiboyその通りです。これに加えて、で動作しない他の多くのタグがありHtml.fromHtml()ます。このチェックアウトstackoverflow.com/a/3150456/1987045
ラーフルレイブエンドラン

素晴らしい、まさに私が欲しかったもの、私のサーバー側の
開発者

3

プログラミングには無限の可能性があることは誰もが知っています。1つの問題に対して利用できる解決策はたくさんあるので、上記の解決策はすべて完璧で、誰かに役立つかもしれないと思いますが、私にとってはこれが私の一日を救います。

したがって、コードは次のようになります

  private void getWebsite() {
    new Thread(new Runnable() {
      @Override
      public void run() {
        final StringBuilder builder = new StringBuilder();

        try {
          Document doc = Jsoup.connect("http://www.ssaurel.com/blog").get();
          String title = doc.title();
          Elements links = doc.select("a[href]");

          builder.append(title).append("\n");

          for (Element link : links) {
            builder.append("\n").append("Link : ").append(link.attr("href"))
            .append("\n").append("Text : ").append(link.text());
          }
        } catch (IOException e) {
          builder.append("Error : ").append(e.getMessage()).append("\n");
        }

        runOnUiThread(new Runnable() {
          @Override
          public void run() {
            result.setText(builder.toString());
          }
        });
      }
    }).start();
  }

上記の関数をで呼び出す必要がonCreate MethodありますMainActivity

これが皆さんのお役に立てば幸いです。

Mediumの元のブログも読んでください


1

WebViewを使用できるかもしれませんが、ドキュメントでわかるように、WebViewはデフォルトでjavascriptやウィジェットなどの他のものをサポートしていません。

http://developer.android.com/reference/android/webkit/WebView.html

必要に応じてJavaScriptを有効にできると思います。


4
はい、JSを簡単に有効にできます。ただし、HTMLの解析にwebviewを使用する必要はありません。
ガイ

1
それは質問に答えません
ラッキーハンドラー2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.