Parsing HTML en Swift (iOS/macOS) : aperçu des bibliothèques SwiftSoup et Fuzi
Lors du développement d'applications pour iOS et macOS, il est souvent nécessaire d'extraire des données de pages web. Le parsing HTML permet d'obtenir automatiquement du contenu, de le structurer et de l'utiliser dans l'application. Dans l'écosystème Swift, plusieurs bibliothèques puissantes existent à cet effet. Dans cet article, nous allons examiner en détail les deux plus populaires : SwiftSoup et Fuzi. Vous apprendrez comment les installer, comment effectuer des opérations de parsing de base et quelles sont leurs particularités.
Pourquoi le parsing HTML en Swift est-il nécessaire ?
Le parsing HTML est utile dans les scénarios suivants :
- Agrégation de données — collecte d'actualités, de prix, de descriptions de produits à partir de plusieurs sites.
- Surveillance des modifications — suivi des mises à jour sur les pages cibles.
- Intégration avec des services web — si le site ne fournit pas d'API, le parsing est le seul moyen d'obtenir des données.
- Automatisation des tests — vérification de la conformité de la structure HTML.
Bibliothèque SwiftSoup
SwiftSoup est un port Swift de la célèbre bibliothèque Java Jsoup. Elle fournit une API pratique pour le parsing, la navigation et la manipulation de documents HTML. SwiftSoup prend en charge les sélecteurs CSS, ce qui rend l'extraction d'éléments simple et intuitive.
Installation de SwiftSoup
Ajoutez la dépendance dans votre Package.swift ou via Swift Package Manager dans Xcode :
// Package.swiftdependencies: [ .package(url: "https://github.com/scinfu/SwiftSoup.git", from: "2.6.0")]Exemple d'utilisation de SwiftSoup
Considérons un exemple simple : chargeons une chaîne HTML et extrayons les titres <h2> et les liens <a>.
import SwiftSoup
func parseHTML() { let html = """ <html> <body> <h2>Titre de l'article</h2> <p>Texte du paragraphe.</p> <a href="https://example.com">Lien</a> </body> </html> """ do { let doc = try SwiftSoup.parse(html) // Extraire tous les titres h2 let headers = try doc.select("h2") for header in headers { print("Titre : \\(try header.text())") } // Extraire tous les liens let links = try doc.select("a[href]") for link in links { let linkText = try link.text() let linkHref = try link.attr("href") print("Texte : \\(linkText), URL : \\(linkHref)") } } catch { print("Erreur de parsing : \\(error)") }}Dans cet exemple, nous utilisons la méthode select() avec le sélecteur CSS "h2" pour sélectionner tous les titres de deuxième niveau, et "a[href]" — pour sélectionner tous les liens avec l'attribut href. La méthode text() renvoie le contenu textuel de l'élément, et attr() — la valeur de l'attribut spécifié.
Navigation dans l'arbre du document
SwiftSoup permet de se déplacer dans l'arbre DOM :
// Obtenir le premier élément h2if let firstHeader = try doc.select("h2").first() { print("Premier titre : \\(try firstHeader.text())")}
// Obtenir l'élément parentlet parent = try firstHeader.parent()print("Parent : \\(try parent?.tagName() ?? "nil")")
// Obtenir l'élément frère suivantlet nextSibling = try firstHeader.nextElementSibling()print("Élément suivant : \\(try nextSibling?.tagName() ?? "nil")")Bibliothèque Fuzi
Fuzi est une autre bibliothèque populaire pour le parsing HTML et XML en Swift. Elle est basée sur libxml2 et se distingue par ses hautes performances. Fuzi prend également en charge les sélecteurs CSS et les requêtes XPath.