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 января, 09:59
Javarush вы лучшие! Спасибо за такое понятное изложение. Будем поступать к вам на курсы.
Anonymous #3237948
Уровень 2
21 февраля 2023, 07:35
я не понял как добавить заголовок к запросу, имитирующий устройство (чтобы не забанили как бота)
Anonymous #3237948
Уровень 2
21 февраля 2023, 08:34
Все, нашел сам. Делается так :
Jsoup.connect(searchString).userAgent("Mozilla/5.0")
Di
Уровень 16
8 февраля 2023, 04:55
Добрый день, а можно ли Jsoup валидировать корректность формата HTML?
Сергей Java Developer в Сбер Expert
29 мая 2023, 14:19
Да
Илья
Уровень 30
8 ноября 2020, 15:31
Без воды и при этом всё доступно) Спасибо!
barracuda
Уровень 41
Expert
29 октября 2020, 21:40
Статья - огонь! Спасибо!
Andrei Po
Уровень 41
23 октября 2020, 14:06
очень хорошо написана статья, коротко, но по сути. спасибо большое. она и небольшой задаче на 19м уровне 1918 - очень помогла)
Artem
Уровень 40
13 июня 2020, 17:43
Я бы еще ссылку добавил, где лежат ВСЕ селекторы. Документация Jsoup
Владислав Backend Developer
24 июля 2020, 09:12
Спасибо большое за ссылку)