使用SwiftSoup在Swift(iOS/macOS)中解析HTML
在开发iOS和macOS应用程序时,经常需要从网页中提取数据。与拥有强大库BeautifulSoup和Scrapy的Python不同,Swift世界长期以来缺乏方便的HTML解析工具。解决方案是SwiftSoup库——流行Java库Jsoup的纯Swift移植版。它提供了便捷的API用于处理HTML文档、在DOM树中导航、通过CSS选择器查找元素以及提取数据。
什么是SwiftSoup?
SwiftSoup是一个开源库,允许解析HTML、提取和修改数据,以及清理HTML中潜在的危险元素。它适用于所有Apple平台:iOS、macOS、tvOS、watchOS。主要功能:
- 从字符串、URL或文件解析HTML
- 使用CSS选择器在DOM树中导航
- 提取元素的文本、属性和HTML代码
- 修改文档(添加、删除、更改元素)
- 清理HTML以防止XSS攻击
- 支持所有现代HTML标准
安装SwiftSoup
最简单的安装方式是通过Swift Package Manager。在Package.swift文件中添加依赖:
// swift-tools-version:5.5import PackageDescription
let package = Package( name: "MyProject", dependencies: [ .package(url: "https://github.com/scinfu/SwiftSoup.git", from: "2.6.0") ], targets: [ .target( name: "MyProject", dependencies: ["SwiftSoup"]) ])如果您使用Xcode,请打开菜单File → Add Packages...,粘贴仓库URL,然后点击Add Package。
HTML解析基础示例
来看一个最简单的示例——提取页面标题:
import SwiftSoup
let html = "<html><head><title>PythonLib - 开发者工具</title></head><body><p>你好,世界!</p></body></html>"
do { let doc = try SwiftSoup.parse(html) let title = try doc.title() print("标题: \\(title)") let bodyText = try doc.body()?.text() print("body文本: \\(bodyText ?? "")")} catch Exception.Error(let type, let message) { print("错误: \\(type) — \\(message)")} catch { print("未知错误")}控制台输出:
标题: PythonLib - 开发者工具body文本: 你好,世界!使用CSS选择器查找元素
SwiftSoup的强项之一是强大的选择器,Web开发者对此非常熟悉。您可以使用任何CSS选择器:
let html = """<div class="articles"> <article id="post-1"> <h2 class="title">SwiftSoup教程</h2> <p class="meta">发布于: 2024-01-15</p> <p>文章内容...</p> </article> <article id="post-2"> <h2 class="title">Swift中的HTML解析</h2> <p class="meta">发布于: 2024-02-20</p> <p>另一篇文章内容...</p> </article></div>"""
let doc = try SwiftSoup.parse(html)
// 按类查找let titles = try doc.select(".title")for title in titles { print(try title.text())}
// 按ID查找if let post = try doc.select("#post-1").first() { let h2 = try post.select("h2").text() let date = try post.select(".meta").text() print("文章: \\(h2) — \\(date)")}
// 组合选择器let articles = try doc.select("div.articles > article")