Parseo de HTML en Swift (iOS/macOS): biblioteca SwiftSoup

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Parseo de HTML en Swift (iOS/macOS) con SwiftSoup



Al desarrollar aplicaciones para iOS y macOS, a menudo surge la necesidad de extraer datos de páginas web. A diferencia de Python con sus potentes bibliotecas BeautifulSoup y Scrapy, en el mundo de Swift durante mucho tiempo no hubo una herramienta conveniente para el parseo de HTML. La solución fue la biblioteca SwiftSoup, un puerto puro de Swift de la popular biblioteca Java Jsoup. Proporciona una API conveniente para trabajar con documentos HTML, navegar por el árbol DOM, buscar elementos mediante selectores CSS y extraer datos.



¿Qué es SwiftSoup?



SwiftSoup es una biblioteca de código abierto que permite analizar HTML, extraer y modificar datos, así como limpiar HTML de elementos potencialmente peligrosos. Funciona en todas las plataformas de Apple: iOS, macOS, tvOS, watchOS. Las principales características son:



  • Parseo de HTML desde una cadena, URL o archivo
  • Navegación por el árbol DOM mediante selectores CSS
  • Extracción de texto, atributos y código HTML de elementos
  • Modificación del documento (agregar, eliminar, cambiar elementos)
  • Limpieza de HTML contra ataques XSS
  • Soporte de todos los estándares modernos de HTML


Instalación de SwiftSoup



La forma más sencilla de instalación es a través de Swift Package Manager. Agregue la dependencia en el archivo 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"]) ])


Si usa Xcode, abra el menú File → Add Packages..., pegue la URL del repositorio y haga clic en Add Package.



Ejemplo básico de parseo de HTML



Veamos un ejemplo muy simple: extraer el título de la página:



import SwiftSoup

let html = "<html><head><title>PythonLib - herramientas para desarrolladores</title></head><body><p>¡Hola, mundo!</p></body></html>"

do { let doc = try SwiftSoup.parse(html) let title = try doc.title() print("Título: \\(title)") let bodyText = try doc.body()?.text() print("Texto del body: \\(bodyText ?? "")")} catch Exception.Error(let type, let message) { print("Error: \\(type) — \\(message)")} catch { print("Error desconocido")}


Salida en consola:

Título: PythonLib - herramientas para desarrolladoresTexto del body: ¡Hola, mundo!


Búsqueda de elementos con selectores CSS



Una de las fortalezas de SwiftSoup son los potentes selectores, familiares para los desarrolladores web. Puede usar cualquier selector CSS:



let html = """<div class="articles">    <article id="post-1">        <h2 class="title">Tutorial de SwiftSoup</h2>        <p class="meta">Publicado: 2024-01-15</p>        <p>Contenido del artículo...</p>    </article>    <article id="post-2">        <h2 class="title">Parseo de HTML en Swift</h2>        <p class="meta">Publicado: 2024-02-20</p>        <p>Otro contenido...</p>    </article></div>"""

let doc = try SwiftSoup.parse(html)

// Búsqueda por claselet titles = try doc.select(".title")for title in titles { print(try title.text())}

// Búsqueda por IDif let post = try doc.select("#post-1").first() { let h2 = try post.select("h2").text() let date = try post.select(".meta").text() print("Artículo: \\(h2) — \\(date)")}

// Selector combinadolet articles = try doc.select("div.articles > article")

Recommendations