Swift(iOS/macOS)中的HTML解析:SwiftSoup和Fuzi库

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Swift(iOS/macOS)中的HTML解析:SwiftSoup和Fuzi库概述



在开发iOS和macOS应用程序时,经常需要从网页中提取数据。HTML解析可以自动获取内容、将其结构化并在应用程序中使用。在Swift生态系统中,有几个强大的库可用于此目的。本文将详细介绍两个最流行的库:SwiftSoup和Fuzi。您将了解如何安装它们、如何执行基本的解析操作以及它们各自的特点。



为什么需要在Swift中解析HTML?

HTML解析在以下场景中非常有用:

  • 数据聚合——从多个网站收集新闻、价格、商品描述。
  • 变更监控——跟踪目标页面的更新。
  • 与Web服务集成——如果网站不提供API,解析是获取数据的唯一方式。
  • 自动化测试——检查HTML结构的正确性。


SwiftSoup库

SwiftSoup是流行Java库Jsoup的Swift移植版。它提供了用于解析、导航和操作HTML文档的便捷API。SwiftSoup支持CSS选择器,使得元素提取变得简单直观。



安装SwiftSoup

在您的Package.swift中或通过Xcode的Swift Package Manager添加依赖:

// Package.swiftdependencies: [    .package(url: "https://github.com/scinfu/SwiftSoup.git", from: "2.6.0")]


SwiftSoup使用示例

来看一个简单的例子:加载一个HTML字符串并提取<h2>标题和<a>链接。

import SwiftSoup

func parseHTML() { let html = """ <html> <body> <h2>文章标题</h2> <p>段落文本。</p> <a href="https://example.com">链接</a> </body> </html> """ do { let doc = try SwiftSoup.parse(html) // 提取所有h2标题 let headers = try doc.select("h2") for header in headers { print("标题: \\(try header.text())") } // 提取所有链接 let links = try doc.select("a[href]") for link in links { let linkText = try link.text() let linkHref = try link.attr("href") print("文本: \\(linkText), URL: \\(linkHref)") } } catch { print("解析错误: \\(error)") }}

在这个例子中,我们使用select()方法和CSS选择器"h2"来选择所有二级标题,使用"a[href]"来选择所有带有href属性的链接。text()方法返回元素的文本内容,而attr()方法返回指定属性的值。



文档树导航

SwiftSoup允许在DOM树中移动:

// 获取第一个h2元素if let firstHeader = try doc.select("h2").first() {    print("第一个标题: \\(try firstHeader.text())")}

// 获取父元素let parent = try firstHeader.parent()print("父元素: \\(try parent?.tagName() ?? "nil")")

// 获取下一个兄弟元素let nextSibling = try firstHeader.nextElementSibling()print("下一个元素: \\(try nextSibling?.tagName() ?? "nil")")


Fuzi库

Fuzi是Swift中另一个流行的HTML和XML解析库。它基于libxml2,具有高性能的特点。Fuzi也支持CSS选择器和XPath查询。

推荐