четверг, 7 апреля 2011 г.

Jsoup: Парсинг Html в Android-приложении

В internet масса полезных данных и так хочется наполнить ими своё приложение... И крайне редко для этого удаётся использовать публичное api или хотя бы rss. Но не беда. С современными библиотеками парсинг страниц превращается в предельно простую задачу. К тому же сайты в стиле web 2.0 содержат относительно немного html, полагаясь всё больше на css и javascript. Соответственно и объём данных, который нужно загрузить для парсинга становится меньше.
Мне довелось использовать разные инструменты для парсинга html, но недавно я открыл для себя библиотеку jsoup и остался ей весьма доволен. Впечатляет скорость работы в сочетании с богатством возможностей. Библиотека позвояет строить документ из "не совсем валидного" html, использовать xpath и css селекторы а также прямую навигацию по DOM-дереву, получать данные из элементов DOM в виде html-фрагментов или "очищенного" текста.
Приведу простой пример:
  1. class TableParser {    
  2.     
  3.     private HashMap map = new HashMap();
  4.     private final String url = "http://site.com"
  5.     
  6.     public HtmlParser() {
  7.         try {
  8.             Document doc = Jsoup.connect(url).get();
  9.             Elements rows = doc.select("div#leftCol table.main tr");
  10.             for (int i=1; i<rows.size();i++) {
  11.                 Element row = rows.get(i);
  12.                 map.put(row.child(0).text().trim(), row.child(1).text());
  13.             }
  14.         } catch (Exception e) {
  15.             e.printStackTrace(System.err);
  16.         }
  17.     }
  18.     
  19.     public HashMap getMap() {
  20.         return this.map;
  21.     }
  22. }
Тут мы создаём документ из url, css-селектором вынимаем из этого документа строки некоторой таблицы и в цикле обходим строки (кроме первой) для того чтобы получить значения первой и второй колонки а затем сложить их к себе в HashMap. Задача, как видим весьма распространённая а решение очень простое.

6 комментариев:

  1. Хорошая штука! Только с фильтрами всё запутано :(

    ОтветитьУдалить
  2. Этот комментарий был удален автором.

    ОтветитьУдалить
  3. Вот ссылка на документацию по фильтрам (дабы нубы не страдали)
    http://jsoup.org/apidocs/org/jsoup/select/Selector.html

    ОтветитьУдалить
  4. Пожалуйста, подскажите как доставать из html пустые строки? Спасибо

    ОтветитьУдалить
  5. Статья огонь, с её помощью обошел ограничение фейсбука на получение номеров телефонов друзей через Facebook sdk :)

    ОтветитьУдалить
  6. Доброго времени суток.

    Подскажите, пожалуйста, возможно ли с помощью jsoup вытаскивать javascript ссылки?

    И если можно, то как?

    Спасибо, Дмитрий.

    ОтветитьУдалить