Kotlin中的HTML解析:jsoup、ktor、khtml及其他工具

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Kotlin中的HTML解析:工具与库完全指南



HTML解析(从网页中提取数据)是创建解析器、内容分析器或集成外部数据时的关键任务之一。在Kotlin生态系统中,有多个强大的库可以高效处理HTML。本文将详细分析最佳工具、它们的特点,并提供实用的代码示例。



1. jsoup —— HTML解析的事实标准



jsoup 是最流行的Java HTML处理库,在Kotlin中同样表现出色。它提供了便捷的API,用于加载、解析和从HTML文档中提取数据。



主要功能:

  • 从URL、文件或字符串加载HTML
  • 支持CSS选择器查找元素
  • 清除不需要的HTML标签
  • 修改DOM树


在Kotlin中使用jsoup的示例:



import org.jsoup.Jsoupimport org.jsoup.nodes.Document

fun main() { // 加载HTML文档 val doc: Document = Jsoup.connect("https://example.com").get() // 提取页面标题 val title: String = doc.title() println("标题: $title") // 查找页面中的所有链接 val links = doc.select("a[href]") links.forEach { link -> val href = link.attr("href") val text = link.text() println("链接: $text -> $href") } // 从特定区块提取文本 val content = doc.select("div.content").text() println("内容: $content") // 处理表单 val form = doc.select("form").first() form?.select("input")?.forEach { input -> println("字段: ${input.attr("name")} = ${input.attr("value")}") }}


2. Ktor Client + khtml —— 现代Kotlin技术栈



Ktor Client 是Kotlin的异步HTTP客户端,与khtml(Kotlin HTML解析器)库配合使用效果极佳。两者结合构成了网页抓取的强大工具。



该方法的优势:

  • 原生支持协程(suspend函数)
  • 异步加载页面
  • 灵活的HTTP请求配置
  • 支持cookies、会话和代理


使用Ktor Client和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 { // 异步加载HTML val response: HttpResponse = client.get(url) val html: String = response.bodyAsText() // 使用jsoup进行解析 val doc = Jsoup.parse(html) val headlines = doc.select("h2, h3").map { it.text() } println("页面标题:") headlines.forEach { println("- $it") } } catch (e: Exception) { println("加载错误: ${e.message}") } finally { client.close() }}

fun main() = runBlocking { fetchAndParse("https://kotlinlang.org")}


3. Selenium WebDriver —— 用于动态页面



如果网站大量使用JavaScript渲染内容,您将需要Selenium WebDriver。它启动真实的浏览器,并允许与动态元素进行交互。



在Kotlin中使用Selenium的示例:



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") // 无GUI模式 addArguments("

推荐