HTML-Parsing in Kotlin: Vollständiger Leitfaden zu Werkzeugen und Bibliotheken
HTML-Parsing (Datenextraktion aus Webseiten) ist eine der Kernaufgaben bei der Erstellung von Parsern, Content-Analysatoren oder der Integration externer Daten. Im Kotlin-Ökosystem gibt es mehrere leistungsstarke Bibliotheken, die eine effiziente Arbeit mit HTML ermöglichen. In diesem Artikel analysieren wir die besten Werkzeuge im Detail, ihre Besonderheiten und geben praktische Codebeispiele.
1. jsoup — De-facto-Standard für HTML-Parsing
jsoup ist die beliebteste Java-Bibliothek für die Arbeit mit HTML, die auch in Kotlin hervorragend funktioniert. Sie bietet eine benutzerfreundliche API zum Laden, Parsen und Extrahieren von Daten aus HTML-Dokumenten.
Hauptfunktionen:
- Laden von HTML aus URL, Datei oder Zeichenkette
- Unterstützung von CSS-Selektoren zur Elementfindung
- Bereinigung von HTML von unerwünschten Tags
- Modifikation des DOM-Baums
Beispiel für die Verwendung von jsoup in Kotlin:
import org.jsoup.Jsoupimport org.jsoup.nodes.Document
fun main() { // HTML-Dokument laden val doc: Document = Jsoup.connect("https://example.com").get() // Seitentitel extrahieren val title: String = doc.title() println("Titel: $title") // Alle Links auf der Seite finden val links = doc.select("a[href]") links.forEach { link -> val href = link.attr("href") val text = link.text() println("Link: $text -> $href") } // Text aus einem bestimmten Block extrahieren val content = doc.select("div.content").text() println("Inhalt: $content") // Arbeit mit Formularen val form = doc.select("form").first() form?.select("input")?.forEach { input -> println("Feld: ${input.attr("name")} = ${input.attr("value")}") }}2. Ktor Client + khtml — moderner Kotlin-Stack
Ktor Client ist ein asynchroner HTTP-Client für Kotlin, der sich hervorragend mit der Bibliothek khtml (Kotlin HTML Parser) kombinieren lässt. Zusammen bilden sie ein leistungsstarkes Werkzeug für Web Scraping.
Vorteile des Ansatzes:
- Native Unterstützung von Koroutinen (suspend-Funktionen)
- Asynchrones Laden von Seiten
- Flexible Konfiguration von HTTP-Anfragen
- Unterstützung von Cookies, Sitzungen und Proxys
Beispiel mit Ktor Client und 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 { // Asynchrones Laden von HTML val response: HttpResponse = client.get(url) val html: String = response.bodyAsText() // Parsen mit jsoup val doc = Jsoup.parse(html) val headlines = doc.select("h2, h3").map { it.text() } println("Überschriften auf der Seite:") headlines.forEach { println("- $it") } } catch (e: Exception) { println("Fehler beim Laden: ${e.message}") } finally { client.close() }}
fun main() = runBlocking { fetchAndParse("https://kotlinlang.org")}3. Selenium WebDriver — für dynamische Seiten
Wenn eine Website JavaScript aktiv zur Darstellung von Inhalten nutzt, benötigen Sie Selenium WebDriver. Es startet einen echten Browser und ermöglicht die Interaktion mit dynamischen Elementen.
Beispiel mit Selenium in 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") // Modus ohne GUI addArguments("