JavaRush /Java блог /Java Developer /Парсинг html библиотекой jsoup
Сергей
40 уровень
Москва

Парсинг html библиотекой jsoup

Статья из группы Java Developer
Итак мы хотим получить конкретную информацию с сайта. Пошагово разберем как это сделать. Парсинг html библиотекой jsoup  - 1Для начала нам нужно получить объект Document. Это представление нашей html страницы. В Jsoup есть несколько способов превратить сайт в объект Document. Подключиться к серверу

Document document = Jsoup.connect("https://hh.ru/").get();
Jsoup сам подключается к сайту. Данный способ самый простой, но он годится только для тестирования. Есть более удобные и гибкие http клиенты. Также имейте ввиду, каким бы http клиентом вы не пользовались, добавляйте в запрос заголовок User-Agent с значением например Chrome/81.0.4044.138. По этому заголовку сервер определяет с какого устройстрва вы подключились. Без этого заголовка сервер считает вас ботом и может забанить. Из файла;

File file = new File("hh-test.html");
Document document = Jsoup.parse(file, "UTF-8", "hh.ru");
Это основной способ получения объекта Document. Последний аргумент "hh.ru" - базовый URI. Это нужно для создания абсолютных ссылок из относительных, которые присутствуют на сайте. Из строки

String html =
                "<html>                                                                       " +
                "    <head>                                                                   " +
                "        <title href=\"hh.ru/vacancy?home\">                                  " +
                "            Работа в Москве, поиск персонала и публикация вакансий - hh.ru   " +
                "        </title>                                                             " +
                "    </head>                                                                  " +
                "    <body>                                                                   " +
                "        <div class=\"header main\">                                          " +
                "            <h1>Работа найдется для каждого</h1>                             " +
                "            <div>Поиск вакансий</div>                                        " +
                "        </div>                                                               " +
                "        <div class=\"content\">                                              " +
                "            <div>Вакансии дня</div>                                          " +
                "            <div id=\"123\">Компании дня</div>                               " +
                "            <div>Работа из дома</div>                                        " +
                "        </div>                                                               " +
                "    </body>                                                                  " +
                "</html>                                                                      ";

        Document document = Jsoup.parse(html, "hh.ru");
Далее я буду демонстрировать библиотеку на этом html, который представляет упрощенный сайт. Получение тега Основная задача при парсинге - получить нужный тег. Делать мы это будем при помощи метода select. Обратите внимание, что он всегда возвращает список тегов. Если теги не найдены, то список будет пустым. В аргумент метода нужно передать css селектор, по которому ищутся теги. На селекторах я остановлюсь подробнее, потому что вся работа сводится к написанию правильного селектора. Обычно нам нужно составить его так, чтобы он возвращал один тег.

Elements h1 = document.select("h1");
System.out.println(h1);
Получить теги теги h1 Вывод:

<h1>Работа найдется для каждого</h1>

Elements titleElem = document.select("head > title");
Получить теги title. Знак > выбирает теги title вложенные в тег head

Elements divs = document.select("body > div");
Получить теги div вложенные в body

Elements firstDiv = document.select("body > div:nth-child(1)");
Получить первый тег div вложенный в body. Получать тег по порядковому номеру плохой способ, потому что его положение на сайте может поменяться. Лучше определить тег по абсолютным параметрам. Такими параметрами являются атрибуты class и id

Elements contentElem = document.select("body > div.content");
Получить тег div c классом "content", вложенный в body

Elements idElem = document.select("#123");
Получить теги c id "123"

Elements divHeader = document.select("body > div.header.main :not(h1)");
Получить теги div c классом "header" и "main", вложенные в body, но без тегов h1 Вывод:

<div>
 Поиск вакансий
</div>
Методы Elements Когда мы получили список Elements можно извлечь данные из него. Напомню, что обычно селектором ищется один тег, т.е. у Elements должен быть размер 1.

  elements.size();
количество найденных тегов

elements.get(0);
получить первый тег из списка найденных

elements.text();
текст вложенный в тег

elements.attr("href");
значение атрибута "href"

elements.outerHtml();
строковое представление тега Если вам нужно быстро получить селектор элемента - в браузере откройте панель разработчика (f12), нажмите правой кнопкой на элемент, "просмотреть код", нажмите правой кнопкой на тег, далее "Copy" "Copy selector". Такой селектор будет не оптимальным, но для быстрого результата вполне подходит. Парсинг html библиотекой jsoup  - 1Парсинг html библиотекой jsoup  - 3Заключение Это основы работы с библиотекой Jsoup. Но этого вполне достаточно, чтобы парсить сайты. Для уверенной работы вам нужна только практика написания селекторов в реальных сайтах. P.s. Данная библиотека используется для решения большой задачи на 38 уровне
Комментарии (10)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Anonymous #3198356 Уровень 1
4 января 2024
Javarush вы лучшие! Спасибо за такое понятное изложение. Будем поступать к вам на курсы.
Anonymous #3237948 Уровень 2
21 февраля 2023
я не понял как добавить заголовок к запросу, имитирующий устройство (чтобы не забанили как бота)
Di Уровень 16
8 февраля 2023
Добрый день, а можно ли Jsoup валидировать корректность формата HTML?
Илья Уровень 30
8 ноября 2020
Без воды и при этом всё доступно) Спасибо!
barracuda Уровень 41 Expert
29 октября 2020
Статья - огонь! Спасибо!
Andrei Po Уровень 41
23 октября 2020
очень хорошо написана статья, коротко, но по сути. спасибо большое. она и небольшой задаче на 19м уровне 1918 - очень помогла)
Artem Уровень 40
13 июня 2020
Я бы еще ссылку добавил, где лежат ВСЕ селекторы. Документация Jsoup