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