Parsing de HTML em Swift (iOS/macOS) com SwiftSoup
Ao desenvolver aplicativos para iOS e macOS, muitas vezes surge a necessidade de extrair dados de páginas HTML. Seja para fazer parsing de um site de notícias, obter taxas de câmbio ou analisar conteúdo web — não se pode prescindir de uma ferramenta confiável. No mundo Swift, o padrão de facto é a biblioteca SwiftSoup — um port puro em Swift do popular parser Java Jsoup.
SwiftSoup fornece uma API conveniente para carregar, fazer parsing e manipular documentos HTML, usando seletores CSS e métodos de navegação DOM. A biblioteca é totalmente escrita em Swift, não possui dependências externas e suporta todas as plataformas Apple: iOS (a partir da versão 11.0), macOS (10.13+), watchOS e tvOS.
Instalação do SwiftSoup via Swift Package Manager
Adicione a dependência no Package.swift do seu projeto ou através do menu do Xcode: File → Add Packages...
// Package.swiftdependencies: [ .package(url: "https://github.com/scinfu/SwiftSoup.git", from: "2.6.0")],targets: [ .target( name: "YourTarget", dependencies: ["SwiftSoup"])]
// Ou no Xcode: https://github.com/scinfu/SwiftSoup.git, versão 2.6.0Após a instalação, importe a biblioteca no arquivo desejado:
import SwiftSoupParsing básico de uma string HTML
A maneira mais simples de começar é fazer parsing de uma string HTML obtida, por exemplo, do URLSession:
let html = """<html> <body> <h1>Olá, mundo!</h1> <p class="content">Este é o texto dentro do parágrafo</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("Título: \\(title)") print("Parágrafo: \\(paragraph ?? "não encontrado")") print("Link: \\(link ?? "não encontrado")")} catch { print("Erro de parsing: \\(error)")}Carregar e fazer parsing de HTML da rede
Na maioria das vezes, o HTML é obtido via HTTP. Aqui está um exemplo de carregamento de página e extração de dados:
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) // Extrair todos os links 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)") } // Extrair cabeçalhos h2 let headings = try doc.select("h2") for heading in headings { print("Cabeçalho: \\(try heading.text())") } } catch { print("Erro: \\(error)") }}
// UsoTask { await fetchAndParse(urlString: "https://example.com")}Trabalhando com seletores CSS
SwiftSoup suporta praticamente todos os seletores CSS padrão, tornando a busca por elementos intuitiva:
tag— pelo nome da tag:try doc.select("div")#id— pelo identificador:try doc.select("#main-content").class— pela classe:try doc.select(".article-title")[attribute]— pelo atributo:try doc.select("[data-id]")parent > child— filho direto:try doc.select("ul > li")el:contains(t
Também na biblioteca
Monitoramento de aplicações Rust: biblioteca `tracing`
ORM para Java: comparação de Hibernate, MyBatis e JPA com exemplos
Validação de dados em TypeScript: bibliotecas Zod, Yup e io-ts