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

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

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

开始课程

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

推荐