Análisis de HTML en Kotlin: Guía completa de herramientas y bibliotecas
El análisis de HTML (extracción de datos de páginas web) es una de las tareas clave al crear parsers, analizadores de contenido o integrar datos externos. En el ecosistema de Kotlin existen varias bibliotecas potentes que permiten trabajar eficientemente con HTML. En este artículo, analizaremos en detalle las mejores herramientas, sus características y proporcionaremos ejemplos prácticos de código.
1. jsoup — el estándar de facto para el análisis de HTML
jsoup es la biblioteca Java más popular para trabajar con HTML, que funciona perfectamente también en Kotlin. Proporciona una API conveniente para cargar, analizar y extraer datos de documentos HTML.
Funcionalidades principales:
- Carga de HTML desde URL, archivo o cadena
- Soporte de selectores CSS para buscar elementos
- Limpieza de HTML de etiquetas no deseadas
- Modificación del árbol DOM
Ejemplo de uso de jsoup en Kotlin:
import org.jsoup.Jsoupimport org.jsoup.nodes.Document
fun main() { // Cargamos el documento HTML val doc: Document = Jsoup.connect("https://example.com").get() // Extraemos el título de la página val title: String = doc.title() println("Título: $title") // Buscamos todos los enlaces en la página val links = doc.select("a[href]") links.forEach { link -> val href = link.attr("href") val text = link.text() println("Enlace: $text -> $href") } // Extraemos el texto de un bloque específico val content = doc.select("div.content").text() println("Contenido: $content") // Trabajo con formularios val form = doc.select("form").first() form?.select("input")?.forEach { input -> println("Campo: ${input.attr("name")} = ${input.attr("value")}") }}2. Ktor Client + khtml — stack moderno de Kotlin
Ktor Client es un cliente HTTP asíncrono para Kotlin que se combina perfectamente con la biblioteca khtml (analizador HTML de Kotlin). Juntos forman una herramienta potente para web scraping.
Ventajas del enfoque:
- Soporte nativo de corrutinas (funciones suspend)
- Carga asíncrona de páginas
- Configuración flexible de solicitudes HTTP
- Soporte de cookies, sesiones y proxies
Ejemplo con Ktor Client y khtml:
import io.ktor.client.*import io.ktor.client.request.*import io.ktor.client.statement.*import kotlinx.coroutines.runBlockingimport org.jsoup.Jsoup
suspend fun fetchAndParse(url: String) { val client = HttpClient() try { // Carga asíncrona de HTML val response: HttpResponse = client.get(url) val html: String = response.bodyAsText() // Análisis con jsoup val doc = Jsoup.parse(html) val headlines = doc.select("h2, h3").map { it.text() } println("Títulos en la página:") headlines.forEach { println("- $it") } } catch (e: Exception) { println("Error al cargar: ${e.message}") } finally { client.close() }}
fun main() = runBlocking { fetchAndParse("https://kotlinlang.org")}3. Selenium WebDriver — para páginas dinámicas
Si el sitio utiliza JavaScript activamente para renderizar contenido, necesitará Selenium WebDriver. Este ejecuta un navegador real y permite interactuar con elementos dinámicos.
Ejemplo con Selenium en Kotlin:
import org.openqa.selenium.Byimport org.openqa.selenium.WebDriverimport org.openqa.selenium.chrome.ChromeDriverimport org.openqa.selenium.chrome.ChromeOptions
fun scrapeDynamicPage() { val options = ChromeOptions().apply { addArguments("--headless") // Modo sin GUI addArguments(" También en la biblioteca
Trabajo con CSV en Java: bibliotecas OpenCSV, Apache Commons CSV y Java Scanner
Validación de datos en Swift (iOS/macOS): mejores prácticas y herramientas
Koin — Contenedor de Inyección de Dependencias para Kotlin