Парсинг HTML в Java: библиотеки Jsoup и HtmlUnit

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Парсинг 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

Рекомендаций