Разбор HTML в Android

83

Я пытаюсь разобрать HTML в android с веб-страницы, и, поскольку веб-страница не сформирована правильно, я получаю SAXException.

Есть ли способ разобрать HTML в Android?

Даниэль Бенедикт
источник
Я подозреваю, что зависимость Rhino превратит htmlunit в ад для компиляции на Android, но вы можете попробовать ... Кроме того, может сработать какой-нибудь другой нестрогий анализатор HTML, такой как soup.
Alex
Интересно, можно ли здесь использовать webkit.
ziya 02

Ответы:

72

Я только что столкнулся с этой проблемой. Я попробовал несколько вещей, но остановился на JSoup . Размер jar составляет около 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
Вы можете попробовать включить полный jar-файл и запустить ProGuard в своем приложении в производственной версии, чтобы удалить неиспользуемый код.
Эндрю Маккензи
3
ВНИМАНИЕ: JSoup работает очень медленно.
Кевин
@kevin - источник этого утверждения? Возможно, у вас включена отладка.
goetzc 02
А как насчет динамически загружаемого контента с использованием 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();
EddieB
источник
красиво и просто, без плагинов, нравится! tnxs
RonEskinder
2
Как примечание: вызов 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. Но нет необходимости использовать веб-просмотр для синтаксического анализа HTML.
Guy
1
Это не ответ на вопрос
luckyhandler