Используем библиотеку JSOUP на примере бэкапа цитат из bash.im

от
Java    jsoup

JSOUP - это Java-библиотека для работы с документами HTML. Она обеспечивает очень удобный API для извлечения и манипулирования данными, используя DOM, CSS, и JQuery-подобные методы. Последняя версия этой библиотеки - 1.8.2, скачать можно с официального сайта. Там же можно найти примеры программ, и документацию.

Прежде чем приступить к парсингу страницы, необходимо получить её html-код и изучить его. Быстро и наглядно это можно сделать в браузере, нажав кнопку F12.
201505260204.png Немного побродив по коду, видим повторяющиеся теги div с универсальным атрибутом class, принимающим значение quote. В каждом из них есть ещё несколько тегов: замечаем где расположена цитата, её дата публикации и номер.

Теперь создаём проект, и подключаем к нему библиотеку JSOUP. Первым делом необходимо создать документ, с которым мы будем работать. Сделать это просто, с помощью одного из методов основного класса библиотеки:
  1. final Document bash = Jsoup.connect("http://www.bash.im/").get();

Теперь с помощью метода select можно получить нужные нам элементы из этого документа, представленные классом Elements:
  1. final List<Element> elms = bash.select(".quote");

Таким образом мы получили все цитаты со страницы. Идём дальше, теперь необходимо каждую цитату представить в желаемом виде. Например, в следующем:
  1. {DATE} | {NUMBER}
  2. {QUOTE}

Для этого создаём класс Quote, который будет хранить цитату, её дату и номер, а так же выводить в нужном формате. Создадим для цитат отдельный список, и продолжаем далее парсить элементы, полученные на предыдущем этапе. Так как он унаследован от ArrayList, то в Java 8 мы можем применить Stream API:
  1. final List<Quote> quotes = new ArrayList<>();
  2. elms.stream().forEach((elem) -> {
  3.     final String date = get(elem, "span[class=date]");
  4.     final String number = get(elem, "a[class=id]");
  5.     final String text = get(elem, "div[class=text]");
  6.  
  7.     if (text != null) {
  8.         quotes.add(new Quote(date, number, text));
  9.     }
  10. });
  1. private String get(Element element, String cssQuery) {
  2.     final Element result = element.select(cssQuery).first();
  3.     if (result != null) {
  4.         return result.html()
  5.                 // способен обрабатывать несколько или более переносов строки
  6.                 .replaceAll("(<br>)\n+(\\1)*", "\n")
  7.                 .replaceAll("<br>", "");
  8.     }
  9.  
  10.     return null;
  11. }

Обратите внимание на null-проверки. Это связано с тем, что реклама на сайте тоже обёрнута точно так же, как и цитата. Следовательно, она тоже попадает в наш список.
Более подробную информацию о использовании метода select можно получить здесь.

Теперь добавим вывод:
  1. quotes.stream().forEach(System.out::println);

И получим какую-нибудь цитату:
  1. $ java -jar BashImGet.jar /quote/433901
  2. 2015-05-25 12:44 | #433901
  3. XXX: Я правильно понял, что конструкция
  4. function somefun() : void
  5. означает, что мы пишем функцию, не возвращающую значений?
  6. YYY: да, правильно
  7. YYY: а это что за язык вообще?

Можно все новые цитаты сохранить в файл:
  1. $ java -jar BashImGet.jar / > bash.im.txt

И если кто-то не жалеет интернет-трафиком и временем, может сделать бэкап всех цитат (осторожнее с несуществующей 666-ой цитатой).

Полные исходники
  BashImGet.tar.gz
  • +3
  • views 14413