تحليل HTML في Swift (iOS/macOS): مكتبات SwiftSoup و Fuzi

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

تحليل HTML في Swift (iOS/macOS): نظرة عامة على مكتبات SwiftSoup و Fuzi



عند تطوير تطبيقات iOS و macOS، غالبًا ما تنشأ الحاجة لاستخراج البيانات من صفحات الويب. يتيح تحليل HTML الحصول تلقائيًا على المحتوى، وتنظيمه، واستخدامه في التطبيق. في بيئة Swift، توجد عدة مكتبات قوية لهذا الغرض. في هذه المقالة، سنستعرض بالتفصيل المكتبتين الأكثر شيوعًا: SwiftSoup و Fuzi. ستتعلم كيفية تثبيتهما، وكيفية إجراء عمليات التحليل الأساسية، وما هي الميزات الخاصة بكل منهما.



لماذا نحتاج تحليل HTML في Swift؟

يفيد تحليل HTML في السيناريوهات التالية:

  • تجميع البيانات — جمع الأخبار والأسعار وأوصاف المنتجات من عدة مواقع.
  • مراقبة التغييرات — تتبع التحديثات على الصفحات المستهدفة.
  • التكامل مع خدمات الويب — إذا كان الموقع لا يوفر API، فإن التحليل هو الطريقة الوحيدة للحصول على البيانات.
  • أتمتة الاختبار — التحقق من صحة بنية HTML.


مكتبة SwiftSoup

SwiftSoup هي نسخة Swift من مكتبة Java الشهيرة Jsoup. توفر واجهة برمجة تطبيقات (API) مريحة لتحليل والتنقل والتلاعب بمستندات HTML. تدعم SwiftSoup محددات CSS، مما يجعل استخراج العناصر بسيطًا وبديهيًا.



تثبيت SwiftSoup

أضف التبعية إلى ملف Package.swift الخاص بك أو عبر Swift Package Manager في Xcode:

// Package.swiftdependencies: [    .package(url: "https://github.com/scinfu/SwiftSoup.git", from: "2.6.0")]


مثال على استخدام SwiftSoup

لننظر إلى مثال بسيط: سنقوم بتحميل سلسلة HTML واستخراج العناوين <h2> والروابط <a>.

import SwiftSoup

func parseHTML() { let html = """ <html> <body> <h2>عنوان المقال</h2> <p>نص الفقرة.</p> <a href="https://example.com">رابط</a> </body> </html> """ do { let doc = try SwiftSoup.parse(html) // استخراج جميع عناوين h2 let headers = try doc.select("h2") for header in headers { print("العنوان: \\(try header.text())") } // استخراج جميع الروابط let links = try doc.select("a[href]") for link in links { let linkText = try link.text() let linkHref = try link.attr("href") print("النص: \\(linkText), الرابط: \\(linkHref)") } } catch { print("خطأ في التحليل: \\(error)") }}

في هذا المثال، نستخدم طريقة select() مع محدد CSS "h2" لاختيار جميع العناوين من المستوى الثاني، و "a[href]" لاختيار جميع الروابط التي تحتوي على السمة href. تقوم طريقة text() بإرجاع المحتوى النصي للعنصر، بينما تقوم attr() بإرجاع قيمة السمة المحددة.



التنقل في شجرة المستند

تتيح SwiftSoup التنقل في شجرة DOM:

// الحصول على أول عنصر h2if let firstHeader = try doc.select("h2").first() {    print("العنوان الأول: \\(try firstHeader.text())")}

// الحصول على العنصر الأبlet parent = try firstHeader.parent()print("الأب: \\(try parent?.tagName() ?? "لا يوجد")")

// الحصول على العنصر الشقيق التاليlet nextSibling = try firstHeader.nextElementSibling()print("العنصر التالي: \\(try nextSibling?.tagName() ?? "لا يوجد")")


مكتبة Fuzi

Fuzi هي مكتبة شائعة أخرى لتحليل HTML و XML في Swift. تعتمد على libxml2 وتتميز بأداء عالٍ. تدعم Fuzi أيضًا محددات CSS واستعلامات XPath.

توصيات