کتابخانه رایگان Swift برای تجزیه و دستکاری دادههای HTML
کتابخانه منبع باز Swift برای تجزیه HTML/XML که یک API تمیز Swift برای تجزیه و پیمایش اسناد HTML و XML به راحتی فراهم میکند.
Kanna چیست؟
اگر تا به حال یک برنامه Swift ساختهاید که نیاز به استخراج دادهها از صفحات وب، تجزیه پاسخهای API به صورت XML، یا استخراج محتوای ساختاری دارد، احتمالاً با چالش کار با رشتههای خام HTML و XML مواجه شدهاید. کتابخانه استاندارد Swift شامل یک تجزیهکننده بومی و کاربرپسند برای این فرمتها نیست، و اینجاست که Kanna وارد عمل میشود تا مشکل را حل کند. در اصل، Kanna یک API تمیز Swift برای تجزیه و پیمایش اسناد HTML و XML فراهم میکند. در پشت صحنه، کار سنگین را به libxml2 واگذار میکند، به این معنی که بدون نیاز به پیادهسازی مجدد قوانین گرامری پیچیده، عملکرد تجزیهای بسیار قوی دریافت میکنید.
Kanna در اکوسیستم Swift به دلیل سادگی و قدرتش برجسته است. با API شهودی خود، میتوانید اسناد HTML/XML را با استفاده از روشهای پرسوجو آشنایی مانند XPath 1.0 و سلکتورهای CSS3 مرور و دستکاری کنید. چه در حال ساخت یک وباسکرپر، استخراج دادهها از فیدهای RSS، یا پردازش فایلهای پیکربندی XML باشید، Kanna ابزارهای مورد نیاز شما را فراهم میکند. پشتیبانی چندپلتفرمی یکی از جذابترین ویژگیهای Kanna است. این کتابخانه بر روی macOS، iOS، tvOS، watchOS و حتی Linux اجرا میشود. XPath 1.0 و سلکتورهای CSS3 دو روش قدرتمند و استاندارد صنعتی برای پرسوجو در اسناد را در اختیار شما میگذارند. پشتیبانی دوگانه از هر دو سلکتور CSS3 و XPath 1.0 باعث میشود Kanna به اندازه کافی انعطافپذیر باشد تا از استخراج ساده HTML تا پردازش پیچیده XML با فضای نامها را پوشش دهد. چه یک برنامه iOS که فید RSS مصرف میکند، یک سرور Vapor که قیمتهای رقبا را اسکرپ میکند، یا یک ابزار خط فرمان که دادههای XML را تبدیل میکند، بسازید، Kanna ابزارهای لازم برای انجام کار بهصورت قابل اعتماد و زیبا را به شما میدهد.
شروع کار با Kanna
روش پیشنهادی و آسانترین برای نصب Kanna استفاده از CocoaPods است. لطفاً برای نصب روان، فرمان زیر را استفاده کنید.
نصب Kanna از طریق Carthage
// add the following line to your Podfile:
use_frameworks!
pod 'Kanna', '~> 5.2.2'
// Then run:
$ pod install
نصب Kanna از طریق CocoaPods
// If you prefer Carthage, add this line to your Cartfile:
github "tid-kijyun/Kanna" ~> 5.2.2
همچنین میتوانید بهصورت دستی نصب کنید؛ فایلهای آخرین نسخه را مستقیماً از مخزن گیتهاب دانلود کنید.
تجزیه اسناد HTML با Swift
کتابخانه متنباز Kanna پشتیبانی از بارگذاری و تجزیه اسناد HTML را در برنامههای Swift فراهم کرده است. رایجترین مورد استفاده برای این تجزیه HTML، چه از وب دانلود شده باشد و چه بهصورت برنامهنویسی ساخته شده. در اینجا یک مثال ساده آورده شده است که نشان میدهد توسعهدهندگان نرمافزار چگونه میتوانند از تابع HTML استفاده کنند که یک رشتهٔ خام HTML را میپذیرد، آن را رمزگذاری میکند و یک شیء سند را برمیگرداند که شامل ویژگیهایی مانند .title و .body است و دسترسی سریع به عناصر رایج را بدون نیاز به سلکتور فراهم میکند.
چگونه HTML را با استفاده از رمزگذاری UTF-8 از طریق کتابخانه Swift تجزیه کنیم؟
import Kanna
// A sample HTML string representing a webpage
let htmlString = """
My Tech Blog
به Swift Parsing خوش آمدید
Kanna تجزیه HTML را آسان و زیبا میکند.
View on GitHub
"""
// Parse the HTML string using UTF-8 encoding
if let doc = try? HTML(html: htmlString, encoding: .utf8) {
// Access the document title directly via a convenience property
print(doc.title ?? "No title found")
// Output: My Tech Blog
// Access the full body text
print(doc.body?.text ?? "No body")
}
پشتیبانی از پرسوجوی سلکتورهای CSS3
کتابخانه Kanna پشتیبانی کامل از CSS3 Selector را فراهم کرده است که به توسعهدهندگان امکان استفاده از سینتکس آشنا CSS برای یافتن عناصر را میدهد. پشتیبانی انتخابگر CSS در Kanna به شما اجازه میدهد از همان سینتکس انتخابگری که ممکن است در یک stylesheet یا متد querySelectorAll در JavaScript بنویسید، استفاده کنید. این باعث میشود برای هر کسی که پیشزمینه توسعه وب دارد، بسیار شهودی باشد. مثال زیر نشان میدهد که چگونه کاربران میتوانند عناصر HTML را انتخاب کرده و بر روی چندین عنصر در داخل برنامههای Swift تکرار کنند.
چگونه چندین عنصر HTML را انتخاب کرده و متن آن را از طریق کتابخانه Swift استخراج کنیم؟
import Kanna
let htmlString = """
-
کتاب سوئیفت
$39.99
-
راهنمای Xcode
$24.99
-
مبانی iOS
$49.99
"""
if let doc = try? HTML(html: htmlString, encoding: .utf8) {
// Select all elements with class "product" inside a "ul"
for product in doc.css("ul.product-list li.product") {
// Extract text from nested span elements using child selectors
let name = product.css("span.name").first?.text ?? "Unknown"
let price = product.css("span.price").first?.text ?? "N/A"
// Access HTML attributes using subscript notation
let productId = product["data-id"] ?? "No ID"
print("[\(productId)] \(name) — \(price)")
}
}
پشتیبانی از پرسوجوی XPath 1.0
کتابخانه Kanna پشتیبانی از پرسوجوی XPath 1.0 را در برنامههای Swift فراهم کرده است. XPath روشی قدرتمندتر و انعطافپذیرتر برای مرور عناصر و ویژگیها در یک سند XML/HTML ارائه میدهد. این بهویژه برای ساختارهای سند پیچیده مفید است. عبارات XPath میتوانند اسناد را به شیوههایی که انتخابگرهای CSS قادر به انجام آن نیستند، پیمایش کنند؛ مانند یافتن عناصر بر اساس موقعیت، روابط والد-فرزندی یا تطبیق متن پیچیده. این برای تجزیه XML و استخراج HTML پیچیده ضروری است.
تجزیه و اعتبارسنجی XML با Swift
فراتر از تجزیهٔ پایهٔ HTML، کتابخانهٔ منبع باز Kanna قابلیتهای قدرتمند پردازش XML را ارائه میدهد. این شامل اعتبارسنجی صحیح ساختار XML و مدیریت ویژگیها میشود. هنگام کار با دادههای ساختاری، نیاز به بیش از استخراج عناصر دارید. Kanna دسترسی کامل به سند XML را فراهم میکند، از جملهٔ نظرات، دستورهای پردازشی و متادیتای سند.
چگونه تجزیه XML را در برنامههای Swift انجام دهیم؟
import Kanna
let xmlString = """
Swift Developer News
-
Kanna 6.0 Released with Swift 6 Support
Alex Johnson
Mon, 26 Jun 2024 00:00:00 GMT
-
New Features in Swift 5.10
Maria Garcia
Tue, 15 Apr 2024 00:00:00 GMT
"""
if let doc = try? Kanna.XML(xml: xmlString, encoding: .utf8) {
// Define a namespace mapping: prefix -> URI
// The prefix you use here ("dc") can be anything; it maps to the namespace URI
let namespaces = [
"dc": "http://purl.org/dc/elements/1.1/"
]
// Query elements in the "dc" namespace using the prefix
for item in doc.xpath("//item", namespaces: namespaces) {
let title = item.at_xpath("title")?.text ?? "No title"
let creator = item.at_xpath("dc:creator", namespaces: namespaces)?.text ?? "Unknown"
let pubDate = item.at_xpath("pubDate")?.text ?? "No date"
print("Title: \(title)")
print("Author: \(creator)")
print("Published: \(pubDate)\n")
}
}