Analysieren Sie HTML in Android


83

Ich versuche, HTML in Android von einer Webseite zu analysieren, und da die Webseite nicht gut geformt ist, bekomme ich SAXException.

Gibt es eine Möglichkeit, HTML in Android zu analysieren?


Ich vermute, dass die Rhino-Abhängigkeit die Kompilierung von HTML-Einheiten unter Android zur Hölle macht, aber Sie könnten es versuchen ... Auch ein anderer nicht strenger HTML-Parser wie Suppe könnte funktionieren.
alex

Ich frage mich, ob das Webkit hier verwendet werden kann.
Ziya

Antworten:


71

Ich bin gerade auf dieses Problem gestoßen. Ich habe ein paar Dinge ausprobiert, mich aber für JSoup entschieden . Das Glas ist ungefähr 132k groß, was ein bisschen groß ist, aber wenn Sie die Quelle herunterladen und einige der Methoden herausnehmen, die Sie nicht verwenden werden, ist es nicht so groß.
=> Das Gute daran ist, dass es schlecht geformtes HTML verarbeitet

Hier ist ein gutes Beispiel von ihrer Website.

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
Sie können versuchen, die vollständige JAR-Datei einzuschließen und ProGuard in Ihrer App in Ihrer Produktionsversion auszuführen, um nicht verwendeten Code zu entfernen.
Andrew Mackenzie

3
VORSICHT: JSoup ist sehr sehr langsam.
Kevin

@ Kevin eine Quelle für diesen Anspruch? Möglicherweise ist das Debuggen aktiviert.
Goetzc

Was ist mit dynamisch geladenen Inhalten mithilfe von Java-Skripten beim Rendern der HTML-Seite auf der Clientseite? Wird Jsoup diesen Inhalt auch zeigen?
MikeL

55

Haben Sie versucht, Html.fromHtml (Quelle) zu verwenden ?

Ich denke, dass die Klasse in Bezug auf die Quellqualität ziemlich liberal ist (sie verwendet intern TagSoup , das mit Blick auf reales, schlechtes HTML entwickelt wurde). Es werden zwar nicht alle HTML-Tags unterstützt, es wird jedoch ein Handler mitgeliefert, mit dem Sie auf nicht verständliche Tags reagieren können.


1
Dies ist sehr einfach, ich kann nicht nach genauen Dingen suchen (wie XPATH)

Aufmerksamkeit bitte. Dies wird "Alle Threads anhalten". Ich stehe vor als wenn ich einen json mit HTML-Format Text drin bekomme. Es gab kein Problem damit, HTML-Text richtig anzuzeigen, aber nach der Verwendung von html.fromhtml () bin ich damit konfrontiert.
David

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

nett und einfach, keine Plugins, ich liebe es! tnxs
RonEskinder

1
Hinweis: Wenn Sie toString()das SpannedObjekt aufrufen, von dem zurückgegeben Html.fromHtml(str)wird, HTMLfunktionieren viele der Tags nicht (einschließlich <i> <u> <b>). Wenn Sie also eine Textansicht einstellen, gehen Sie wie folgt vor:myTextView.setText(Html.fromHtml(str))
Sakiboy

@ Sakiboy Du hast recht. Darüber hinaus gibt es viele andere Tags, die nicht funktionieren Html.fromHtml(). Überprüfen Sie dies aus stackoverflow.com/a/3150456/1987045
Rahul Raveendran

genial, genau das, was ich wollte, mein serverseitiger
Entwickler hat

3

Wir alle wissen, dass das Programmieren endlose Möglichkeiten bietet. Es gibt eine Reihe von Lösungen für ein einzelnes Problem, daher denke ich, dass alle oben genannten Lösungen perfekt sind und für jemanden hilfreich sein können, aber für mich ist dies eine Rettung für meinen Tag.

So - Code geht so

  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();
  }

Sie müssen nur die obige Funktion in onCreate MethodIhrem aufrufenMainActivity

Ich hoffe, dieser ist auch für euch hilfreich.

Lesen Sie auch den Original-Blog unter Medium


1

Vielleicht können Sie WebView verwenden, aber wie Sie im Dokument sehen können, unterstützt WebView standardmäßig kein Javascript und andere Dinge wie Widgets.

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

Ich denke, dass Sie Javascript aktivieren können, wenn Sie es brauchen.


4
Ja, Sie können JS einfach aktivieren. Es ist jedoch nicht erforderlich, Webview für die HTML-Analyse zu verwenden.
Guy

1
Das beantwortet die Frage nicht
Luckyhandler
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.