Парсинг HTML в Kotlin: обзор библиотек и практические примеры
Kotlin — современный мультиплатформенный язык, который активно используется для разработки серверных приложений, Android-приложений и инструментов автоматизации. Одной из частых задач является парсинг HTML — извлечение данных с веб-страниц, работа с DOM-деревом или генерация HTML-шаблонов. В этой статье мы рассмотрим основные библиотеки для парсинга HTML в Kotlin, их особенности и приведём рабочие примеры кода.
Зачем нужен парсинг HTML в Kotlin?
Парсинг HTML требуется в таких сценариях, как:
- Сбор данных с сайтов (веб-скрапинг).
- Автоматизация тестирования веб-интерфейсов.
- Генерация HTML-отчётов или шаблонов писем.
- Обработка и анализ контента, полученного из API или файлов.
Благодаря совместимости с Java и собственным DSL-конструкциям, Kotlin предлагает как проверенные Java-библиотеки, так и нативные решения.
1. Jsoup — универсальный парсер HTML/XML
Jsoup — самая популярная библиотека для парсинга HTML в экосистеме JVM. Она предоставляет удобный API для загрузки, парсинга и манипуляции HTML-документами, поддерживает CSS-селекторы и jQuery-подобные методы. Для Kotlin Jsoup прекрасно подходит благодаря полной совместимости с Java и возможности использовать Kotlin-расширения.
Установка (Gradle)
dependencies {
implementation("org.jsoup:jsoup:1.17.2")
}
Пример: извлечение заголовков статей с блога
import org.jsoup.Jsoup
import org.jsoup.nodes.Document
fun main() {
// Загружаем HTML-документ по URL
val doc: Document = Jsoup.connect("https://example.com/blog").get()
// Извлекаем все заголовки h2 с классом "post-title"
val titles = doc.select("h2.post-title")
// Выводим текст каждого заголовка
titles.forEach { title ->
println(title.text())
}
// Пример с использованием CSS-селектора: все ссылки внутри статей
val links = doc.select("article a[href]")
links.forEach { link ->
println("${link.text()} -> ${link.attr("href")}")
}
}
Jsoup также позволяет парсить HTML из строки, файла или InputStream, а также очищать HTML от потенциально опасных элементов (XSS-защита).
2. kotlinx.html — типобезопасный DSL для работы с HTML
kotlinx.html — официальная библиотека JetBrains, предназначенная для генерации HTML-кода с помощью типобезопасного DSL. В отличие от Jsoup, она не парсит существующий HTML, а создаёт его. Однако её можно комбинировать с Jsoup для полного цикла: парсинг → модификация → генерация.
Установка (Gradle)
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-html-jvm:0.11.0")
}
Пример: генерация HTML-страницы
import kotlinx.html.*
import kotlinx.html.stream.createHTML
fun main() {
val htmlContent = createHTML().html {
head {
title("Пример страницы")
meta(charset = "UTF-8")
}
body {
h1 { +"Привет, Kotlin!" }
p {
+"Это абзац, сгенерированный с помощью "
b { +"kotlinx.html" }
}
ul {
li { +"Пункт 1" }
li { +"Пункт 2" }
li { +"Пункт 3" }
}
}
}
println(htmlContent)
}
Этот подход особенно полезен для создания отчётов, шаблонов писем или динамических страниц на сервере (Ktor).
3. Ktor Client + Jsoup — для парсинга с HTTP-запросами
Если нужно выполнять сложные HTTP-запросы (с куками, заголовками, аутентификацией) перед парсингом, удобно использовать Ktor Client в паре с Jsoup. Ktor — асинхронный HTTP-клиент, отлично интегрирующийся с Kotlin coroutines.
Пример: парсинг страницы с авторизацией
import io.ktor.client.*
import io.ktor.client.request.*
import io.ktor.client.statement.*
import kotlinx.coroutines.runBlocking
import org.jsoup.Jsoup
fun main() = runBlocking {
val client = HttpClient()
// Выполняем GET-запрос
val response: HttpResponse = client.get("https://example.com/dashboard") {
header("Authorization", "Bearer token123")
}
val html = response.bodyAsText()
val doc =