Безкоштовна Swift бібліотека для парсингу та маніпулювання HTML даними
Відкрита Swift бібліотека для парсингу HTML/XML, яка надає чистий Swift API для легкого парсингу та обходу HTML та XML документів.
Що таке Kanna?
Якщо ви коли‑небудь створювали Swift‑додаток, який потребує витягати дані зі веб‑сторінок, парсити відповіді API у форматі XML або збирати структурований контент, ви, ймовірно, стикалися з проблемою роботи з необробленими рядками HTML та XML. Стандартна бібліотека Swift не містить вбудованого, зручного парсера для цих форматів, і саме тут Kanna приходить на допомогу. По суті, Kanna надає чистий Swift API для парсингу та обходу 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 робить її достатньо гнучкою для роботи як із простим витягом 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
Ви також можете встановити його вручну; завантажте останні файли релізу безпосередньо з репозиторію GitHub.
Парсинг 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 дозволяє використовувати той самий синтаксис селекторів, який ви могли б написати у таблиці стилів або в JavaScript‑методі querySelectorAll. Це робить її дуже інтуїтивною для будь‑якого, хто має досвід веб‑розробки. Нижче наведено приклад, який показує, як користувачі можуть вибирати HTML‑елементи та ітерувати кілька елементів у Swift‑додатках.
Як вибрати кілька HTML-елементів та витягнути з них текст за допомогою Swift бібліотеки?
import Kanna
let htmlString = """
-
Книга Swift
$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")
}
}