Парсинг HTML в Kotlin: полный обзор инструментов и библиотек
Kotlin — современный язык программирования, работающий на JVM, Android и в браузере. Благодаря совместимости с Java и мощной стандартной библиотеке, Kotlin предлагает несколько эффективных способов парсинга HTML. В этой статье мы рассмотрим основные библиотеки для парсинга HTML в Kotlin, их особенности и приведём практические примеры кода.
1. Jsoup — универсальный парсер HTML для Kotlin
Jsoup — самая популярная библиотека для парсинга HTML на JVM. Она отлично работает с Kotlin благодаря полной совместимости с Java. Jsoup позволяет загружать HTML из URL, файла или строки, а затем извлекать данные с помощью CSS-селекторов и DOM-навигации.
Установка Jsoup в Kotlin проект
Добавьте зависимость в build.gradle.kts:
dependencies {
implementation("org.jsoup:jsoup:1.17.2")
}
Пример парсинга HTML с Jsoup
import org.jsoup.Jsoup
import org.jsoup.nodes.Document
fun main() {
val url = "https://example.com"
val doc: Document = Jsoup.connect(url).get()
val title = doc.title()
println("Заголовок страницы: $title")
// Извлекаем все ссылки
val links = doc.select("a[href]")
links.forEach { link ->
println("Ссылка: ${link.attr("abs:href")} — ${link.text()}")
}
// Парсинг из строки
val html = "<div class='content'>Привет, Kotlin!</div>"
val parsed = Jsoup.parse(html)
val text = parsed.select(".content").text()
println("Текст из HTML: $text")
}
2. Ktor Client + kotlinx.html — нативный Kotlin подход
Для проектов, использующих Ktor в качестве HTTP-клиента, отличным выбором станет связка ktor-client и kotlinx.html. Первый отвечает за загрузку страниц, второй — за парсинг HTML в типизированную DOM-структуру.
Зависимости для Ktor и kotlinx.html
dependencies {
implementation("io.ktor:ktor-client-core:2.3.7")
implementation("io.ktor:ktor-client-cio:2.3.7")
implementation("org.jetbrains.kotlinx:kotlinx-html-jvm:0.11.0")
}
Пример парсинга с Ktor и kotlinx.html
import io.ktor.client.*
import io.ktor.client.request.*
import io.ktor.client.statement.*
import kotlinx.html.*
import kotlinx.html.parser.*
suspend fun parseHtmlWithKtor() {
val client = HttpClient()
val response: HttpResponse = client.get("https://example.com")
val htmlContent = response.bodyAsText()
val document = parseHtml(htmlContent)
val title = document.head?.title ?: "Без заголовка"
println("Заголовок: $title")
// Извлекаем все параграфы
document.body?.allElements?.filterIsInstance<P>()?.forEach { p ->
println("Параграф: ${p.text}")
}
client.close()
}
3. Сравнение библиотек для парсинга HTML в Kotlin
Выбор инструмента зависит от конкретной задачи. Вот основные критерии:
- Jsoup — лучший выбор для сложного парсинга с CSS-селекторами. Подходит для скрапинга данных, извлечения таблиц, форм и медиа-элементов.
- Ktor + kotlinx.html — идеален для проектов на Ktor, где требуется лёгкий парсинг без лишних зависимостей. Работает асинхронно.
- HtmlCleaner — ещё одна Java-библиотека, хорошо совместимая с Kotlin. Полезна для очистки "грязного" HTML.
- OkHttp + Jsoup — комбинация для тонкой настройки HTTP-запросов с мощным парсингом.
4. Продвинутые техники парсинга на Kotlin
Извлечение данных с помощью CSS-селекторов (Jsoup)
val doc = Jsoup.connect("https://news.ycombinator.com").get()
val stories = doc.select("tr.athing")
stories.forEach { story ->
val title = story.select("td.title a").text()
val link = story.select("td.title a").attr("href")
println("$title -> $link")
}
Работа с асинхронным парсингом (Ktor + coroutines)
suspend fun fetchMultiplePages(urls: List<String>): List<