Парсинг HTML на Java: Jsoup, HtmlUnit и другие инструменты

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

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

Начать курс

Парсинг HTML в Java: обзор библиотек и инструментов

Парсинг HTML — это процесс извлечения структурированных данных из HTML-документов. В Java для этой задачи существует несколько мощных библиотек, позволяющих не только разбирать статические страницы, но и обрабатывать динамический контент. В этой статье мы рассмотрим три наиболее популярных инструмента: Jsoup, HtmlUnit и Jericho HTML Parser. Каждый из них имеет свои особенности и области применения.

1. Jsoup — универсальный парсер HTML

Jsoup — это самая популярная Java-библиотека для работы с HTML. Она предоставляет удобный API для загрузки, парсинга и извлечения данных, а также поддерживает CSS-селекторы и манипуляции с DOM-деревом. Jsoup идеально подходит для статических страниц и простых задач веб-скрапинга.

Основные возможности:

  • Загрузка HTML из URL, файла или строки
  • Извлечение данных с помощью CSS-селекторов
  • Очистка HTML от нежелательных тегов
  • Модификация DOM (добавление/удаление элементов)
  • Автоматическое исправление некорректного HTML

Пример кода: извлечение заголовков новостей

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;

public class JsoupExample {
    public static void main(String[] args) throws Exception {
        // Загружаем HTML-страницу
        Document doc = Jsoup.connect("https://example.com/news")
                            .userAgent("Mozilla/5.0")
                            .timeout(5000)
                            .get();
        
        // Извлекаем все заголовки h2 с классом "news-title"
        Elements titles = doc.select("h2.news-title");
        
        // Выводим текст каждого заголовка
        titles.forEach(title -> System.out.println(title.text()));
    }
}

2. HtmlUnit — парсинг с поддержкой JavaScript

HtmlUnit — это headless-браузер на Java, который эмулирует работу веб-браузера. В отличие от Jsoup, он выполняет JavaScript-код, обрабатывает AJAX-запросы и поддерживает куки. Это незаменимый инструмент для парсинга современных SPA-приложений и сайтов с динамическим контентом.

Ключевые особенности:

  • Полная эмуляция браузера (Chrome, Firefox, IE)
  • Выполнение JavaScript (включая jQuery и React)
  • Поддержка форм, кликов, навигации по страницам
  • Работа с куками, сессиями и редиректами
  • Встроенная поддержка XPath и CSS-селекторов

Пример кода: ожидание загрузки динамического контента

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 {
        try (WebClient webClient = new WebClient()) {
            // Отключаем логирование и таймауты
            webClient.getOptions().setThrowExceptionOnScriptError(false);
            webClient.getOptions().setJavaScriptEnabled(true);
            
            // Загружаем страницу
            HtmlPage page = webClient.getPage("https://example.com/dynamic");
            
            // Ждём 2 секунды для выполнения JS
            webClient.waitForBackgroundJavaScript(2000);
            
            // Извлекаем данные по XPath
            HtmlElement element = page.getFirstByXPath("//div[@class='result']/p");
            System.out.println("Результат: " + element.getTextContent());
        }
    }
}

3. Jericho HTML Parser — лёгкий и быстрый

Jericho HTML Parser — это лёгкая библиотека с минимальными зависимостями. Она отлично справляется с парсингом невалидного HTML и предоставляет низкоуровневый доступ к структуре документа. Подходит для задач, где требуется максимальная производительность и контроль.

Преимущества:

  • Минимальный размер (около 300 КБ)
  • Устойчивость к битому HTML
  • Поддержка кодировок и HTML-сущностей
  • Потоковая обработка больших документов
  • Простой API на основе Source/Element

Пример кода: извлечение ссылок

import net.htmlparser.jericho.Source;
import net.htmlparser.jericho.Element;
import net.htmlparser.jericho.Attribute;

public class JerichoExample {
    public static void main(String[] args) throws Exception {
        // Загружаем HTML из URL
        Source source = new Source(new java.net.URL("https://example.com"));
        source.fullSequentialParse();
        
        // Извлекаем все теги <a> с атрибутом href
        for (Element link                    

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