Используем библиотеку JSOUP на примере бэкапа цитат из bash.im
от Kalter
JSOUP - это Java-библиотека для работы с документами HTML. Она обеспечивает очень удобный API для извлечения и манипулирования данными, используя DOM, CSS, и JQuery-подобные методы. Последняя версия этой библиотеки - 1.8.2, скачать можно с официального сайта. Там же можно найти примеры программ, и документацию.
Прежде чем приступить к парсингу страницы, необходимо получить её html-код и изучить его. Быстро и наглядно это можно сделать в браузере, нажав кнопку F12.
Немного побродив по коду, видим повторяющиеся теги div с универсальным атрибутом class, принимающим значение quote. В каждом из них есть ещё несколько тегов: замечаем где расположена цитата, её дата публикации и номер.
Теперь создаём проект, и подключаем к нему библиотеку JSOUP. Первым делом необходимо создать документ, с которым мы будем работать. Сделать это просто, с помощью одного из методов основного класса библиотеки:
Теперь с помощью метода select можно получить нужные нам элементы из этого документа, представленные классом Elements:
Таким образом мы получили все цитаты со страницы. Идём дальше, теперь необходимо каждую цитату представить в желаемом виде. Например, в следующем:
Для этого создаём класс Quote, который будет хранить цитату, её дату и номер, а так же выводить в нужном формате. Создадим для цитат отдельный список, и продолжаем далее парсить элементы, полученные на предыдущем этапе. Так как он унаследован от ArrayList, то в Java 8 мы можем применить Stream API:
Обратите внимание на null-проверки. Это связано с тем, что реклама на сайте тоже обёрнута точно так же, как и цитата. Следовательно, она тоже попадает в наш список.
Более подробную информацию о использовании метода select можно получить здесь.
Теперь добавим вывод:
И получим какую-нибудь цитату:
Можно все новые цитаты сохранить в файл:
И если кто-то не жалеет интернет-трафиком и временем, может сделать бэкап всех цитат (осторожнее с несуществующей 666-ой цитатой).
Полные исходники
BashImGet.tar.gz
Прежде чем приступить к парсингу страницы, необходимо получить её html-код и изучить его. Быстро и наглядно это можно сделать в браузере, нажав кнопку F12.
Немного побродив по коду, видим повторяющиеся теги div с универсальным атрибутом class, принимающим значение quote. В каждом из них есть ещё несколько тегов: замечаем где расположена цитата, её дата публикации и номер.
Теперь создаём проект, и подключаем к нему библиотеку JSOUP. Первым делом необходимо создать документ, с которым мы будем работать. Сделать это просто, с помощью одного из методов основного класса библиотеки:
- final Document bash = Jsoup.connect("http://www.bash.im/").get();
Теперь с помощью метода select можно получить нужные нам элементы из этого документа, представленные классом Elements:
- final List<Element> elms = bash.select(".quote");
Таким образом мы получили все цитаты со страницы. Идём дальше, теперь необходимо каждую цитату представить в желаемом виде. Например, в следующем:
- {DATE} | {NUMBER}
- {QUOTE}
Для этого создаём класс Quote, который будет хранить цитату, её дату и номер, а так же выводить в нужном формате. Создадим для цитат отдельный список, и продолжаем далее парсить элементы, полученные на предыдущем этапе. Так как он унаследован от ArrayList, то в Java 8 мы можем применить Stream API:
- final List<Quote> quotes = new ArrayList<>();
- elms.stream().forEach((elem) -> {
- final String date = get(elem, "span[class=date]");
- final String number = get(elem, "a[class=id]");
- final String text = get(elem, "div[class=text]");
- if (text != null) {
- quotes.add(new Quote(date, number, text));
- }
- });
- private String get(Element element, String cssQuery) {
- final Element result = element.select(cssQuery).first();
- if (result != null) {
- return result.html()
- // способен обрабатывать несколько или более переносов строки
- .replaceAll("(<br>)\n+(\\1)*", "\n")
- .replaceAll("<br>", "");
- }
- return null;
- }
Обратите внимание на null-проверки. Это связано с тем, что реклама на сайте тоже обёрнута точно так же, как и цитата. Следовательно, она тоже попадает в наш список.
Более подробную информацию о использовании метода select можно получить здесь.
Теперь добавим вывод:
- quotes.stream().forEach(System.out::println);
И получим какую-нибудь цитату:
- $ java -jar BashImGet.jar /quote/433901
- 2015-05-25 12:44 | #433901
- XXX: Я правильно понял, что конструкция
- function somefun() : void
- означает, что мы пишем функцию, не возвращающую значений?
- YYY: да, правильно
- YYY: а это что за язык вообще?
Можно все новые цитаты сохранить в файл:
- $ java -jar BashImGet.jar / > bash.im.txt
И если кто-то не жалеет интернет-трафиком и временем, может сделать бэкап всех цитат (осторожнее с несуществующей 666-ой цитатой).
Полные исходники
BashImGet.tar.gz