Статьи Утилиты 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-документе. Обладая этими знаниями, вы уже можете написать собственный краулер, а то и новый поисковик.


Облако тэгов

Kotlin, Java, Spring, Spring Boot, Spring Data, SQL, PostgreSQL, Oracle, Linux, Hibernate, Collections, Stream API, многопоточность, файлы, Nginx, Apache, maven, gradle, JUnit, YouTube, новости, руководство, ООП, алгоритмы, головоломки, rest, GraphQL, Excel, XML, json, yaml.

Последние статьи


Комментарии

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

×

devmark.ru