تحليل HTML في Kotlin: دليل شامل للأدوات والمكتبات
تحليل HTML (استخراج البيانات من صفحات الويب) هو إحدى المهام الأساسية عند إنشاء أدوات التحليل، أو محللي المحتوى، أو دمج البيانات الخارجية. في نظام Kotlin البيئي، توجد عدة مكتبات قوية تتيح العمل بكفاءة مع HTML. في هذه المقالة، سنستعرض بالتفصيل أفضل الأدوات، وميزاتها، ونقدم أمثلة عملية على الكود.
1. jsoup — المعيار الفعلي لتحليل HTML
jsoup هي المكتبة الأكثر شيوعًا في Java للعمل مع HTML، وتعمل بشكل ممتاز أيضًا في Kotlin. توفر واجهة برمجة تطبيقات مريحة لتحميل وتحليل واستخراج البيانات من مستندات HTML.
الإمكانيات الرئيسية:
- تحميل HTML من رابط، ملف، أو نص
- دعم محددات CSS للبحث عن العناصر
- تنظيف HTML من العلامات غير المرغوب فيها
- تعديل شجرة DOM
مثال على استخدام jsoup في Kotlin:
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 هو عميل HTTP غير متزامن لـ Kotlin، يتناسب بشكل ممتاز مع مكتبة khtml (محلل HTML لـ Kotlin). معًا، يشكلان أداة قوية لتجميع بيانات الويب.
مزايا هذا النهج:
- دعم أصلي للـ coroutines (دوال suspend)
- تحميل الصفحات بشكل غير متزامن
- إعداد مرن لطلبات HTTP
- دعم cookies، الجلسات، والـ proxy
مثال مع 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. يقوم بتشغيل متصفح حقيقي ويسمح بالتفاعل مع العناصر الديناميكية.
مثال مع Selenium في 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") // وضع بدون واجهة رسومية addArguments("