Parsing de HTML em Swift: biblioteca SwiftSoup para iOS/macOS

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

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.0


Após a instalação, importe a biblioteca no arquivo desejado:



import SwiftSoup


Parsing 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

Recommendations