Статьи
Утилиты Telegram YouTube Отзывы

Как парсить HTML с помощью Jsoup

Видеогайд

10 апреля 2022

Тэги: Collections, Java, maven, Stream API, XML, руководство.

Содержание

  1. Подключаем Jsoup и парсим HTML
  2. Выбор элементов и их атрибутов
  3. Выводы

Если вы пишете робота на Java для разбора контента с каких-либо сайтов (т.н. «краулер»), то вы можете встретиться с некоторыми сложностями. Язык HTML хоть и формализован, однако допускает ошибки в разметке без нарушения отображения, в отличие от более строгого XML. Самой частой ошибкой является незакрытый тэг.

Страница в браузере может выглядеть корректно, но при попытке разобрать вёрстку вы потерпите неудачу. Кроме html 5-ой версии, существует ещё несколько стандартов вёрстки.

Чтобы не изобретать велосипед, можно воспользоваться готовой библиотекой Jsoup, которая позволяет легко парсить исходный html и выбирать оттуда отдельные элементы в простом декларативном синтаксисе. Библиотека поддерживает выбор как в формате CSS (более привычный на frontend), так и в XPath.

Подключаем Jsoup и парсим HTML

Для подключения достаточно добавить в maven следующую зависимость:

<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.14.3</version>
</dependency>

Скачивать html содержимое можно силами самой библиотеки:

try {
    var document = Jsoup.connect("https://devmark.ru/").get();
    // бизнес-логика
} catch (Exception e) {
    // обработка ошибок парсинга
}

Если же вы используете асинхронную модель, когда робот сначала скачивает содержимое множества страниц, а затем в отдельном процессе выполняет обработку, то библиотека поддерживает также парсинг строки и чтение из файла:

var htmlFile = new File("/home/user/Documents/index.html");
var document = Jsoup.parse(htmlFile, StandardCharsets.UTF_8.name());

Выбор элементов и их атрибутов

После получения объекта Document, вы можете запрашивать у него различные элементы и их атрибуты. Далее будем запрашивать элементы в формате CSS. Если известно, что элемент должен быть на странице в единственном экземпляре (например, тэг title), то используйте метод selectFirst():

var titleElement = document.selectFirst("title");
System.out.printf("Title: %s%n", titleElement.text());

Но более безопасно использовать общий подход, когда элементов может быть несколько. Например, для получения всех гиперссылок на странице, используйте метод select():

var anchors = document.body().select("a");
System.out.printf("Anchor count: %s%n", anchors.size());

Мы получаем список объектов Element, у каждого из которых нужно взять значение атрибута href с помощью метода attr():

var links = anchors.stream()
        .map(anchor ->
                anchor.attr("href")
        ).toList();
System.out.println(links);

В результате в консоль будут выведены все гиперссылки, которые есть на странице.

Выводы

Как видите, Jsoup предоставляет простое и понятное API для выбора элементов и их атрибутов, которые содержатся в скачанном html-документе. Обладая этими знаниями, вы уже можете написать собственный краулер, а то и новый поисковик.



Комментарии

Добавить комментарий

×

devmark.ru