Parseo en Swift: creamos un parser de datos en 30 minutos

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

Por qué Swift es el lenguaje ideal para el parseo del que no se habla

\n\n

Cuando se habla de recopilar datos de internet, todo el mundo piensa inmediatamente en Python con su BeautifulSoup y Scrapy. Pero, ¿y si te dijera que Swift, el lenguaje que usas para aplicaciones iOS, es capaz de hacer lo mismo? Sí, no has oído mal. El parseo en Swift no es solo una excentricidad, sino una herramienta poderosa que puede funcionar 2-3 veces más rápido que Python en tareas similares. Y hoy lo demostraremos.

\n\n

En este artículo aprenderás a configurar el entorno, escribir tu primer parser en Swift, manejar errores y guardar datos. No usaremos abstracciones complejas, solo código limpio y comprensible que podrás ejecutar en menos de 15 minutos.

\n\n

¿Qué es el parseo y scraping en Swift?

\n\n

Parseo Swift es el proceso de extraer datos estructurados de páginas web o documentos utilizando el lenguaje de programación Swift. A diferencia del web scraping clásico en Python, Swift ofrece integración nativa con iOS/macOS, lo que lo hace ideal para crear aplicaciones que recopilan datos por sí mismas.

\n\n

Los principales casos de uso del scraping de datos Swift son:

\n
    \n
  • Recopilación de precios de tiendas online para monitorear competidores
  • \n
  • Extracción de datos de contacto de sitios de directorios
  • \n
  • Análisis de feeds de noticias y blogs
  • \n
  • Creación de APIs propias para aplicaciones (cuando no hay API oficial)
  • \n
\n\n

Para el parseo en Swift usaremos dos tecnologías clave: URLSession para descargar páginas HTML y la librería SwiftSoup para analizar el documento HTML. SwiftSoup es el equivalente al BeautifulSoup de Python, pero escrito en Swift puro.

\n\n

Instalación y configuración del proyecto

\n\n

Para empezar, necesitamos instalar SwiftSoup. La forma más sencilla es a través de Swift Package Manager. Crea un nuevo proyecto o abre uno existente en Xcode, luego agrega la dependencia:

\n\n
// En Package.swift\ndependencies: [\n    .package(url: "https://github.com/scinfu/SwiftSoup.git", from: "2.6.0")\n]
\n\n

O, si trabajas con SPM sin Xcode, simplemente agrega la línea anterior a tu Package.swift.

\n\n

Una forma alternativa es usar CocoaPods:

\n
pod 'SwiftSoup', '~> 2.6.0'
\n\n

Después de la instalación, importa la librería en tu código:

\n
import SwiftSoup\nimport Foundation
\n\n

¡Listo! Ahora podemos empezar a escribir el parser.

\n\n

Escribimos nuestro primer parser en Swift: paso a paso

\n\n

Escribamos un parser que extraiga los títulos de los artículos de la página principal de Hacker News (news.ycombinator.com). Esta es una tarea clásica para aprender parseo.

\n\n

Paso 1: Descargar la página HTML

\n\n

Usamos URLSession para la descarga asíncrona de datos. Swift es un lenguaje con un fuerte soporte para async/await, así que usaremos el enfoque moderno.

\n\n
func fetchHTML(from urlString: String) async throws -> String {\n    guard let url = URL(string: urlString) else {\n        throw URLError(.badURL)\n    }\n    \n    let (data, _) = try await URLSession.shared.data(from: url)\n    guard let html = String(data: data, encoding: .utf8) else {\n        throw URLError(.cannotDecodeContentData)\n    }\n    \n    return html\n}
\n\n

Observa: devolvemos una cadena HTML. Estos son los datos sin procesar que analizaremos.

\n\n

Paso 2: Parsear HTML con SwiftSoup

\n\n

Ahora viene la parte interesante: la extracción de datos. SwiftSoup funciona como los selectores CSS: indicas qué elementos quieres obtener.

\n\n
func parseTitles(from html: String) throws -> [String] {\n    let doc = try SwiftSoup.parse(html)\n    let titles = try doc.select(".titleline a").array()\n    \n    var result: [String] = []\n    for title in titles {\n        let text = try title.text()\n                

Blogs

Book Recommendations