Парсинг HTML в Java: обзор библиотек Jsoup и HtmlUnit
Парсинг HTML (или веб-скрапинг) — это процесс извлечения данных из HTML-документов. В Java для этой задачи существует несколько мощных библиотек, среди которых выделяются Jsoup (для статического HTML) и HtmlUnit (для динамических страниц с JavaScript). В этой статье мы подробно разберём обе библиотеки, покажем примеры кода и поможем выбрать подходящий инструмент для вашего проекта на pythonlib.ru.
Что такое Jsoup?
Jsoup — это легковесная библиотека для парсинга, извлечения и манипуляции HTML-документами. Она поддерживает CSS-селекторы, что делает её интуитивно понятной для веб-разработчиков. Jsoup работает с любым HTML, даже если он некорректно свёрстан.
Установка Jsoup
Добавьте зависимость в ваш pom.xml (Maven):
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.17.2</version>
</dependency>
Пример парсинга с Jsoup
Рассмотрим базовый пример — получение заголовка страницы и всех ссылок:
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class JsoupExample {
public static void main(String[] args) throws Exception {
// 1. Загружаем HTML-документ
Document doc = Jsoup.connect("https://example.com").get();
// 2. Извлекаем заголовок страницы
String title = doc.title();
System.out.println("Заголовок: " + title);
// 3. Находим все ссылки (теги <a>)
Elements links = doc.select("a[href]");
for (Element link : links) {
String href = link.attr("href");
String text = link.text();
System.out.println("Ссылка: " + href + " — текст: " + text);
}
// 4. Извлекаем текст из определённого блока (например, <div class="content">)
Element content = doc.selectFirst("div.content");
if (content != null) {
System.out.println("Содержимое блока: " + content.text());
}
}
}
В этом примере Jsoup.connect() выполняет HTTP-запрос, а select() использует CSS-селекторы для поиска элементов. Jsoup также умеет работать с локальными файлами и строками HTML.
Что такое HtmlUnit?
HtmlUnit — это "безголовый" браузер (headless browser) на Java. Он не только парсит HTML, но и выполняет JavaScript, обрабатывает AJAX-запросы и эмулирует действия пользователя. Это идеальный выбор для сайтов, где контент подгружается динамически.
Установка HtmlUnit
<dependency>
<groupId>net.sourceforge.htmlunit</groupId>
<artifactId>htmlunit</artifactId>
<version>2.70.0</version>
</dependency>
Пример парсинга с HtmlUnit
Парсинг страницы, которая загружает данные через JavaScript:
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.html.HtmlElement;
public class HtmlUnitExample {
public static void main(String[] args) throws Exception {
// 1. Создаём WebClient (аналог браузера)
try (WebClient webClient = new WebClient()) {
// Отключаем CSS и логирование для ускорения
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setJavaScriptEnabled(true);
webClient.getOptions().setThrowExceptionOnScriptError(false);
// 2. Загружаем страницу (JavaScript выполнится автоматически)
HtmlPage page = webClient.getPage("https://example.com/dynamic");
// 3. Ждём, пока завершатся AJAX-запросы (опционально)
webClient.waitForBackgroundJavaScript(3000);
// 4. Извлекаем текст из элемента по ID
HtmlElement element = page.getElementById("dynamic-content");
if (element != null) {
System.out.println("Динамический контент: " + element.getTextContent());
}
// 5. Находим все элементы по CSS-классу
List<HtmlElement> items = page.getByXPath("//div[@class='item']");
for (HtmlElement item : items) {
System.out.println("Элемент: " + item.getTextContent());
}
}
}
}
HtmlUnit поддерживает XPath и CSS-селекторы (через querySelector()). Он может эмулировать клики, заполнение форм и даже работу с cookie.
Сравнение Jsoup и HtmlUnit
Также в библиотеке
Email отправка на Go (Golang): библиотеки и примеры кода
ExcelJS для JavaScript (Node.js): полное руководство с примерами
Elasticsearch клиент для Java: полное руководство по работе с Java Client