Парсинг HTML в Kotlin: библиотеки и примеры кода

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

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

Начать курс

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

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