تحليل HTML في Swift (iOS/macOS) باستخدام SwiftSoup
عند تطوير تطبيقات iOS وmacOS، غالبًا ما تنشأ الحاجة لاستخراج البيانات من صفحات HTML. سواء كان تحليل موقع أخباري، أو الحصول على أسعار العملات، أو تحليل محتوى الويب - لا يمكن الاستغناء عن أداة موثوقة. في عالم Swift، تعتبر مكتبة SwiftSoup المعيار الفعلي - وهي منفذ Swift نقي لمحلل Java الشهير Jsoup.
توفر SwiftSoup واجهة برمجة تطبيقات مريحة لتحميل وتحليل ومعالجة مستندات HTML باستخدام محددات CSS وطرق اجتياز DOM. المكتبة مكتوبة بالكامل بلغة Swift، وليس لها تبعيات خارجية، وتدعم جميع منصات Apple: iOS (بدءًا من 11.0)، وmacOS (10.13+)، وwatchOS، وtvOS.
تثبيت SwiftSoup عبر Swift Package Manager
أضف التبعية في ملف Package.swift لمشروعك أو عبر قائمة Xcode: File → Add Packages...
// Package.swiftdependencies: [ .package(url: "https://github.com/scinfu/SwiftSoup.git", from: "2.6.0")],targets: [ .target( name: "YourTarget", dependencies: ["SwiftSoup"])]
// أو في Xcode: https://github.com/scinfu/SwiftSoup.git، الإصدار 2.6.0بعد التثبيت، قم باستيراد المكتبة في الملف المطلوب:
import SwiftSoupتحليل سلسلة HTML أساسية
أسهل طريقة للبدء هي تحليل سلسلة HTML تم الحصول عليها، على سبيل المثال، من URLSession:
let html = """<html> <body> <h1>مرحبًا بالعالم!</h1> <p class="content">هذا نص داخل الفقرة</p> <a href="https://example.com">رابط</a> </body></html>"""
do { let doc: Document = try SwiftSoup.parse(html) let title = try doc.title() let paragraph = try doc.select("p.content").first()?.text() let link = try doc.select("a").first()?.attr("href") print("العنوان: \\(title)") print("الفقرة: \\(paragraph ?? "غير موجود")") print("الرابط: \\(link ?? "غير موجود")")} catch { print("خطأ في التحليل: \\(error)")}تحميل وتحليل HTML من الشبكة
غالبًا ما يتم الحصول على HTML عبر HTTP. إليك مثال لتحميل صفحة واستخراج البيانات:
import Foundationimport SwiftSoup
func fetchAndParse(urlString: String) async { guard let url = URL(string: urlString) else { return } do { let (data, _) = try await URLSession.shared.data(from: url) guard let html = String(data: data, encoding: .utf8) else { return } let doc = try SwiftSoup.parse(html) // استخراج جميع الروابط let links = try doc.select("a[href]") for link in links { let href = try link.attr("href") let text = try link.text() print("\\(text) -> \\(href)") } // استخراج عناوين h2 let headings = try doc.select("h2") for heading in headings { print("العنوان: \\(try heading.text())") } } catch { print("خطأ: \\(error)") }}
// الاستخدامTask { await fetchAndParse(urlString: "https://example.com")}العمل مع محددات CSS
تدعم SwiftSoup تقريبًا جميع محددات CSS القياسية، مما يجعل البحث عن العناصر بديهيًا:
tag— حسب اسم الوسم:try doc.select("div")#id— حسب المعرف:try doc.select("#main-content").class— حسب الفئة:try doc.select(".article-title")[attribute]— حسب السمة:try doc.select("[data-id]")parent > child— السليل المباشر:try doc.select("ul > li")el:contains(t