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

免费 Swift 库,用于解析和操作 HTML 数据

开源 HTML/XML 解析 Swift 库,提供简洁的 Swift API,轻松解析和遍历 HTML 与 XML 文档。

Kanna 是什么?

如果您曾经构建过需要从网页提取数据、解析 XML 格式的 API 响应或抓取结构化内容的 Swift 应用程序,您可能已经遇到处理原始 HTML 和 XML 字符串的挑战。Swift 的标准库并未包含这些格式的原生、易用的解析器,这正是 Kanna 发挥作用、拯救局面的地方。Kanna 的核心提供了一个简洁的 Swift API,用于解析和遍历 HTML 与 XML 文档。在内部,它将繁重的工作委托给 libxml2,这意味着您可以获得坚如磐石的解析性能,而无需自行重新实现复杂的语法规则。

Kanna 在 Swift 生态系统中因其简洁性和强大功能而脱颖而出。凭借直观的 API,您可以使用熟悉的查询方式,如 XPath 1.0 和 CSS3 选择器,来导航和操作 HTML/XML 文档。无论是构建网页爬虫、从 RSS 源提取数据,还是处理 XML 配置文件,Kanna 都提供您所需的工具。跨平台支持是 Kanna 最具吸引力的特性之一。它可运行于 macOS、iOS、tvOS、watchOS,甚至 Linux。XPath 1.0 和 CSS3 选择器为您提供两种强大且业界标准的文档查询方式。它对 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 中可能编写的相同选择器语法。这对来自网页开发背景的人员非常直观。下面的示例展示了用户如何在 Swift 应用程序中选择 HTML 元素并遍历多个元素。

如何使用 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")
    }
}


 中国人