1. 製品
  2.   HTML
  3.   Swift
  4.   Kanna
 
  

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は信頼性とエレガンスを持って仕事を完了するためのツールを提供します。

Previous Next

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")
    }
}


 日本