HTML-Parsing in Swift (iOS/macOS) mit SwiftSoup
Bei der Entwicklung von Apps für iOS und macOS besteht häufig die Notwendigkeit, Daten aus HTML-Seiten zu extrahieren. Ob es sich um das Parsen einer Nachrichtenseite, das Abrufen von Wechselkursen oder die Analyse von Webinhalten handelt – ohne ein zuverlässiges Werkzeug geht es nicht. In der Swift-Welt ist die Bibliothek SwiftSoup der De-facto-Standard – ein reiner Swift-Port des beliebten Java-Parsers Jsoup.
SwiftSoup bietet eine praktische API zum Laden, Parsen und Manipulieren von HTML-Dokumenten unter Verwendung von CSS-Selektoren und DOM-Traversierungsmethoden. Die Bibliothek ist vollständig in Swift geschrieben, hat keine externen Abhängigkeiten und unterstützt alle Apple-Plattformen: iOS (ab 11.0), macOS (10.13+), watchOS und tvOS.
Installation von SwiftSoup über den Swift Package Manager
Fügen Sie die Abhängigkeit in Ihrer Package.swift oder über das Xcode-Menü hinzu: File → Add Packages...
// Package.swiftdependencies: [ .package(url: "https://github.com/scinfu/SwiftSoup.git", from: "2.6.0")],targets: [ .target( name: "YourTarget", dependencies: ["SwiftSoup"])]
// Oder in Xcode: https://github.com/scinfu/SwiftSoup.git, Version 2.6.0Nach der Installation importieren Sie die Bibliothek in die gewünschte Datei:
import SwiftSoupBasis-Parsing eines HTML-Strings
Der einfachste Weg, um zu beginnen, ist das Parsen eines HTML-Strings, der z. B. von URLSession stammt:
let html = """<html> <body> <h1>Hallo, Welt!</h1> <p class="content">Dies ist Text innerhalb eines Absatzes</p> <a href="https://example.com">Link</a> </body></html>"""
do { let doc: Document = try SwiftSoup.parse(html) let title = try doc.title() let paragraph = try doc.select("p.content").first()?.text() let link = try doc.select("a").first()?.attr("href") print("Titel: \\(title)") print("Absatz: \\(paragraph ?? "nicht gefunden")") print("Link: \\(link ?? "nicht gefunden")")} catch { print("Parsing-Fehler: \\(error)")}Laden und Parsen von HTML aus dem Netzwerk
Häufig wird HTML über HTTP bezogen. Hier ist ein Beispiel zum Laden einer Seite und Extrahieren von Daten:
import Foundationimport SwiftSoup
func fetchAndParse(urlString: String) async { guard let url = URL(string: urlString) else { return } do { let (data, _) = try await URLSession.shared.data(from: url) guard let html = String(data: data, encoding: .utf8) else { return } let doc = try SwiftSoup.parse(html) // Alle Links extrahieren let links = try doc.select("a[href]") for link in links { let href = try link.attr("href") let text = try link.text() print("\\(text) -> \\(href)") } // h2-Überschriften extrahieren let headings = try doc.select("h2") for heading in headings { print("Überschrift: \\(try heading.text())") } } catch { print("Fehler: \\(error)") }}
// VerwendungTask { await fetchAndParse(urlString: "https://example.com")}Arbeiten mit CSS-Selektoren
SwiftSoup unterstützt praktisch alle standardmäßigen CSS-Selektoren, was die Suche nach Elementen intuitiv macht:
tag— nach Tag-Namen:try doc.select("div")#id— nach ID:try doc.select("#main-content").class— nach Klasse:try doc.select(".article-title")[attribute]— nach Attribut:try doc.select("[data-id]")parent > child— direktes Kind:try doc.select("ul > li")el:contains(t
Auch in der Bibliothek
Testen in JavaScript (Node.js): Frameworks und Werkzeuge
Testen in JavaScript (Node.js): Frameworks und Werkzeuge
Arbeiten mit CSV in C# (.NET): Bibliotheken und Beispiele
Maschinelles Lernen mit C++: Überblick über die wichtigsten Bibliotheken
Sinon für JavaScript (Node.js): Komplettguide mit Beispielen