Розбір HTML в Android


83

Я намагаюся проаналізувати HTML в андроїді з веб-сторінки, і оскільки веб-сторінка вона погано сформована, я отримую SAXException.

Чи є спосіб проаналізувати HTML в Android?


Я підозрюю, що залежність Rhino зробить htmlunit пеклом для компіляції на Android, але ви можете спробувати ... Крім того, деякі інші несуворі HTML-аналізатори, такі як суп, можуть працювати.
alex 02

Цікаво, чи можна тут використовувати webkit.
зия

Відповіді:


71

Я щойно зіткнувся з цією проблемою. Я спробував кілька речей, але зупинився на використанні JSoup . Банка складає близько 132 тис., Що трохи більше, але якщо ви завантажите джерело та виймете деякі методи, якими ви не будете користуватися, то вони не такі великі.
=> Гарна річ у тому, що він буде обробляти погано сформований 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
Ви можете спробувати включити повну банку та запустити ProGuard на своєму додатку у виробничому випуску, щоб видалити невикористаний код.
Ендрю Маккензі,

3
ПОПЕРЕДЖЕННЯ: JSoup працює дуже повільно.
kevin

@kevin джерело для цього твердження? Можливо, у вас увімкнено налагодження.
goetzc

А як щодо динамічно завантаженого вмісту за допомогою сценарію Java під час рендерінгу сторінки html на стороні клієнта? Чи покаже Jsoup і цей вміст?
MikeL

56

Ви пробували використовувати Html.fromHtml (джерело) ?

Я думаю, що клас досить ліберальний щодо якості вихідного коду (він використовує TagSoup внутрішньо, який був розроблений з урахуванням реального життя, маючи на увазі поганий HTML). Хоча він не підтримує всі теги HTML, але він постачається з обробником, який ви можете реалізувати для реагування на теги, які він не розуміє.


1
Це дуже просто, я не можу шукати точні речі (наприклад, XPATH)

увага будь-ласка. це "Призупинення всіх потоків". Я стикаюся з тим, коли отримую JSON із текстом у форматі HTML. не було проблем із правильним показом HTML-тексту, але після використання html.fromhtml () я стикаюся з цим.
Девід

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

приємно і просто, без плагінів, люблю це! tnxs
RonEskinder

1
Як примітка: виклик toString()на Spannedоб'єкті повернувся з Html.fromHtml(str)заставити багатьох HTMLтегів не працює ( в тому числі <i> <u> <b>). Отже, якщо ви встановлюєте текстове подання, просто виконайте:myTextView.setText(Html.fromHtml(str))
Сакібой,

@Sakiboy Ви маєте рацію. На додаток до цього існує безліч інших тегів, з якими не працює Html.fromHtml(). Перевірте це stackoverflow.com/a/3150456/1987045
Рахул Равендран

дивовижно, саме те, що я хотів, розробник на моїй стороні сервера надсилав мені html, тепер я можу легко перетворити його на необроблений рядок, дякую
Zulqurnain Jutt

3

Ми всі знаємо, що програмування має безмежні можливості. Існує безліч рішень, доступних для однієї проблеми, тому я думаю, що всі перераховані вище рішення є ідеальними і можуть бути корисними для когось, але для мене це збереже мій день ..

Тож Кодекс йде так

  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. Але немає необхідності використовувати webview для синтаксичного аналізу html.
Гай

1
Це не відповідає на запитання
luckyhandler
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.