HTMLデータを解析・操作する無料Swiftライブラリ
HTML/XMLのパースを容易に行えるクリーンなSwift APIを提供するオープンソースSwiftライブラリ
Kanna とは何ですか?
Webページからデータを抽出したり、XMLでAPIレスポンスを解析したり、構造化されたコンテンツをスクレイピングしたりする必要があるSwiftアプリを作ったことがあるなら、生のHTMLやXML文字列を扱う際の課題に直面したことがあるでしょう。Swiftの標準ライブラリにはこれらのフォーマット用のネイティブで使いやすいパーサが含まれていません。そこでKannaの出番です。Kannaは、HTMLおよびXMLドキュメントを解析・走査するためのクリーンなSwift APIを提供します。内部では、重い処理をlibxml2に委任しているため、複雑な文法規則を自分で実装し直すことなく、堅牢なパース性能を得られます。
Kannaは、そのシンプルさとパワーでSwiftエコシステムの中で際立っています。直感的なAPIにより、XPath 1.0やCSS3セレクタなどの馴染みのあるクエリ手法を使ってHTML/XMLドキュメントをナビゲートし操作できます。ウェブスクレイパーの構築、RSSフィードからのデータ抽出、XML設定ファイルの処理など、Kannaは必要なツールを提供します。クロスプラットフォームのサポートはKannaの最も魅力的な特長の一つです。macOS、iOS、tvOS、watchOS、さらにはLinuxでも動作します。XPath 1.0とCSS3セレクタは、ドキュメントをクエリするための強力な業界標準の2つの方法を提供します。CSS3セレクタとXPath 1.0の両方をサポートしているため、シンプルなHTML抽出から複雑な名前空間付きXML処理まで柔軟に対応できます。RSSフィードを消費するiOSアプリの構築、競合価格をスクレイプするVaporサーバー、XMLデータを変換するコマンドラインツールのいずれであっても、Kannaは信頼性とエレガンスを持って仕事を完了するためのツールを提供します。
Kanna の入門
Kanna をインストールする推奨かつ最も簡単な方法は CocoaPods を使用することです。スムーズなインストールのために以下のコマンドを使用してください。
CarthageでKannaをインストール
// add the following line to your Podfile:
use_frameworks!
pod 'Kanna', '~> 5.2.2'
// Then run:
$ pod install
CocoaPodsでKannaをインストール
// If you prefer Carthage, add this line to your Cartfile:
github "tid-kijyun/Kanna" ~> 5.2.2
手動でインストールすることもできます。最新のリリースファイルを GitHub リポジトリから直接ダウンロードしてください。
Swift で HTML ドキュメントをパースする
オープンソースの Kanna ライブラリは、Swift アプリケーション内で HTML ドキュメントを読み込み、解析するサポートを組み込んでいます。HTML を解析する最も一般的なユースケースは、ウェブからダウンロードしたものでもプログラムで生成したものでも同様です。以下は、ソフトウェア開発者が生の HTML 文字列を受け取る HTML 関数を使用し、エンコードして .title や .body などのプロパティを持つドキュメントオブジェクトを返す簡単な例です。このオブジェクトにより、セレクタを使用せずに一般的な要素へ迅速にアクセスできます。
SwiftライブラリでUTF-8エンコーディングを使用してHTMLを解析する方法は?
import Kanna
// A sample HTML string representing a webpage
let htmlString = """
My Tech Blog
Swift パーシングへようこそ
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 セレクタの完全サポートを含んでおり、開発者は慣れ親しんだ CSS 構文を使用して要素を検索できます。Kanna の CSS セレクタサポートにより、スタイルシートや JavaScript の querySelectorAll で記述するのと同じセレクタ構文を使用できます。これにより、ウェブ開発のバックグラウンドを持つ人にとって非常に直感的です。以下の例は、ユーザーが HTML 要素を選択し、Swift アプリケーション内で複数の要素を反復処理できる方法を示しています。
Swiftライブラリで複数のHTML要素を選択し、テキストを抽出する方法は?
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 ライブラリは Swift アプリ内での XPath 1.0 クエリのサポートも含んでいます。XPath は XML/HTML ドキュメント内の要素や属性をナビゲートする、より強力で柔軟な方法を提供します。特に複雑なドキュメント構造に有用です。XPath 式は、要素の位置や親子関係、複雑なテキストマッチングなど、CSS セレクタではできない方法でドキュメントを横断できます。XML パースや複雑な HTML スクレイピングに不可欠です。
Swift での XML パースと検証
基本的なHTMLパースを超えて、オープンソースのKannaライブラリは強力なXML処理機能を提供します。これには、適切なXML構造の検証と属性管理が含まれます。構造化データを扱う際には、要素の抽出だけでは不十分です。Kannaはコメント、処理指示、ドキュメントメタデータを含む、XMLドキュメント全体へのアクセスを提供します。
Swiftアプリ内でXMLパースを実行する方法は?
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")
}
}