Итак мы хотим получить конкретную информацию с сайта. Пошагово разберем как это сделать.
Для начала нам нужно получить объект
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". Такой селектор будет не оптимальным, но для быстрого результата вполне подходит.
Заключение
Это основы работы с библиотекой Jsoup. Но этого вполне достаточно, чтобы парсить сайты. Для уверенной работы вам нужна только практика написания селекторов в реальных сайтах.
P.s. Данная библиотека используется для решения большой задачи на 38 уровне
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ