El web scraping con expresiones regulares puede ser una herramienta poderosa para extraer datos de sitios web; sin embargo, también tiene sus limitaciones. Uno de los principales problemas del uso de expresiones regulares para el web scraping es que puede fallar cuando cambia la estructura del HTML.
Por ejemplo, consideremos el siguiente fragmento de código en el que intentamos extraer el texto del h2 utilizando expresiones regulares:
<html>
<head>
<title>Example Title</title>
</head>
<body>
<h1>Page Title</h1>
<p>This is a paragraph under the title</p>
<h2>First Subtitle</h2>
<p>First paragraph under the subtitle</p>
<h2>Second Subtitle</p>
</body>
</html>
Compara la primera etiqueta <h2> con la segunda. Es posible que observes que la segunda etiqueta <h2> no está correctamente cerrada, y que el código tiene </p> en lugar de </h2>. Actualicemos el fragmento con esto:
import re
html = "<html><head><title>Example Title</title></head><body><h1>Page Title</h1><p>This is a paragraph under the title</p><h2>First Subtitle</h2><p>First paragraph under the subtitle</p><h2>Second Subtitle</p></body></html>"
headingTags = re.findall("<h2>(.*?)</h2>", html)
print(*headingTags, sep = "\n")
Ejecutemos el código y comprobemos el resultado:
First Subtitle
Falta el texto de la segunda etiqueta de encabezado. Esto ocurre porque la regla de expresiones regulares no coincide con la etiqueta de encabezado sin cerrar.
Una solución a este problema es utilizar una biblioteca como BeautifulSoup, que permite navegar y buscar en la estructura del árbol HTML, en lugar de depender de expresiones regulares. Con BeautifulSoup, puedes extraer el título de una página web así:
from bs4 import BeautifulSoup
html = "<html><head><title>Example Title</title></head><body><h1>Page Title</h1><p>This is a paragraph under the title</p><h2>First Subtitle</h2><p>First paragraph under the subtitle</p><h2>Second Subtitle</p></body></html>"
soup = BeautifulSoup(html, 'html.parser')
for headingTag in soup.findAll('h2'):
print(headingTag.text)
BeautifulSoup consigue extraer etiquetas malformadas y el resultado es el siguiente:
First Subtitle
Second Subtitle
Este enfoque es más robusto ante los cambios en la estructura HTML, ya que no depende de patrones específicos en el código HTML. Si te interesa saber más sobre BeautifulSoup, este artículo es una lectura perfecta.
Otra solución es utilizar una API de web scraping como WebScrapingAPI, que elimina las complejidades del web scraping y te permite extraer fácilmente los datos que necesitas sin preocuparte por la estructura HTML subyacente.
Con WebScrapingAPI, puedes extraer datos de cualquier sitio web con una simple llamada a la API, y esta gestiona automáticamente los cambios en la estructura HTML.