Lista de los mejores analizadores HTML de Python

Descubra los mejores analizadores HTML de Python (Beautiful Soup, HTMLParser, lxml, PyQuery y Scrapy) para simplificar y acelerar sus proyectos de Scraping web.
15 min de lectura

Python es una opción popular para el Scraping web, gracias a la cantidad de analizadores HTML disponibles. En este artículo, explorará los analizadores más utilizados:Beautiful Soup,HTMLParser,lxml,PyQuery yScrapy. Estos analizadores son los preferidos por su facilidad de uso, velocidad, compatibilidad con los estándares HTML modernos, documentación y apoyo de la comunidad.

¡Empecemos!

Beautiful Soup

Beautiful Soup es una biblioteca de Python para el parseo de documentos HTML y XML. Crea un árbol de parseo que refleja la estructura de cada página, lo que facilita la extracción automática de datos. Este árbol representa la jerarquía de elementos dentro del documento, lo que le permite navegar y buscar en él de manera eficiente para localizar nodos específicos.

Características y facilidad de uso

Beautiful Soup es útil para organizar documentos HTML en información estructurada. Incluye varios analizadores, comohtml.parser,lxml yhtml5lib, que le ayudan a manejar diferentes tipos de marcado, como HTML estándar, HTML malformado o roto, XHTML, HTML5 y XML. Esto le ofrece la flexibilidad de elegir el mejor equilibrio entre velocidad y precisión. Por ejemplo, si estás trabajando con una página web que tiene etiquetas faltantes o elementos anidados incorrectamente, puedes usarhtml5libpara analizar el contenido HTML tal como lo haría un navegador web.

Beautiful Soup también puede ser útil en tareas de Scraping web en las que la estructura HTML es impredecible o desorganizada. Una vez analizado el documento, puede buscar fácilmente en el árbol para localizar los nodos. Los métodos de búsqueda como find(), find_all() y select() proporcionan formas de acceder a los elementos basándose en identificadores, clases, contenido de texto o atributos. Tanto si busca todas las instancias de una etiqueta como si se centra en un elemento, el uso del selector adecuado garantiza un acceso rápido a los datos necesarios con un mínimo esfuerzo de codificación.

Velocidad

Beautiful Soup no es el analizador más rápido, pero ofrece estrategias de parseo flexibles que le proporcionanadaptabilidad. Por defecto, utilizahtml.parser de Python, que es el más adecuado para tareas sencillas, como trabajar con documentos pequeños para extraer datos de una entrada de blog. Si desea extraer y procesar una gran cantidad de datos, considere la posibilidad de utilizar un analizador diferente.

Compatibilidad con los estándares HTML más recientes

Si desea analizar elementos y atributosHTML5de páginas web estáticas, Beautiful Soup es una excelente opción. Su compatibilidad con los analizadores sintácticos garantiza el cumplimiento delos estándares HTML más recientes.

Documentación y asistencia

Beautiful Soup cuenta conuna amplia documentación y es utilizado por más de 850 000 usuarios enGitHub. Su documentación ofrece ejemplos, tutoriales y referencias que facilitan el inicio.

Obtenga más información sobre el Scraping web con Beautiful Soup aquí.

Ejemplo de código

Para instalar Beautiful Soup, ejecute el siguiente comando desde su shell o terminal:

pip3 install beautifulsoup4

El siguiente fragmento de código utiliza Beautiful Soup para analizar datos delsitio web Books to Scrape:

import requests
from bs4 import BeautifulSoup

# URL de la página web que se va a extraer
books_page_url = "https://books.toscrape.com/"

# Obtener el contenido de la página web
response = requests.get(books_page_url)

# Comprueba si la solicitud se ha realizado correctamente
if response.status_code == 200:
    # Analiza el contenido HTML de la página
    soup_parser = BeautifulSoup(response.text, 'html.parser')

    # Busca todos los artículos que contengan información sobre libros
    book_articles = soup_parser.find_all('article', class_='product_pod')

    # Recorre cada artículo de libro y extrae su título y precio
    for book_article in book_articles:
        # Extrae el título del libro
        book_name = book_article.h3.a['title']
        
        # Extrae el precio del libro
        book_cost = book_article.find('p', class_='price_color').text
        
        # Imprimir el título y el precio del libro
        print(f"Título: {book_name}, Precio: {book_cost}")
else:
    # Imprimir un mensaje de error si no se ha podido recuperar la página
    print("No se ha podido recuperar la página web")

Si desea probar este código, guárdelo en un archivo llamado beautifulsoup_books_scrape.py y ejecútelo con el siguiente comando:

python3 beautifulsoup_books_scrape.py

Deberías ver todos los títulos y precios de los libros de la primera página impresos en tu terminal o shell:

...salida omitida...
Título: Soumission, Precio:  50,10 £
Título: Sharp Objects, Precio:  47,82 £
Título: Sapiens: Una breve historia de la humanidad, Precio: 54,23 £
Título: The Requiem Red, Precio: 22,65 £
Título: The Dirty Little Secrets of Getting Your Dream Job, Precio: 33,34 £
...salida omitida...

Si eres nuevo en el Scraping web, la simplicidad de Beautiful Soup y su capacidad para navegar por el árbol HTML lo convierten en una buena opción para tus proyectos de Scraping web.

HTMLParser

HTMLParser es una biblioteca que viene preinstalada con Python y te permite analizar y extraer datos de documentos HTML.

Características y facilidad de uso

Aunque HTMLParser carece de algunas de las características que ofrecen otras bibliotecas de parseo comolxmlyhtml5lib, la simplicidad de HTMLParser y su integración con Python lo convierten en una buena opción para proyectos con estructuras de datos simples en los que el contenido HTML es coherente (por ejemplo,el scraping web de páginas web estáticas). Sin embargo, si se trata de contenido HTML malformado, HTMLParser no es la mejor opción.

Velocidad

La velocidad de HTMLParser es adecuada para la mayoría de los casos de uso del parseo HTML en los que se tienen documentos de tamaño pequeño a moderado (es decir, de unos pocos kilobytes a un par de megabytes) y necesidades mínimas de preprocesamiento. Sin embargo, para documentos HTML más complejos, es preferible utilizar analizadores como lxml.

Compatibilidad con los estándares HTML más recientes

HTMLParser admite el parseo HTML básico, pero puede tener dificultades con documentos HTML muy complejos o mal formados. Además, no es totalmente compatible con el último estándar HTML5.

Documentación y asistencia

Dado que HTMLParser forma parte de la biblioteca de Python, cuenta condocumentacióny soporte fiables. Es fácil encontrar ayuda a través de plataformas como Stack Overflow, GitHub y foros relacionados con Python.

Ejemplo de código

Como se ha indicado anteriormente, el módulo HTMLParser está incluido en la biblioteca estándar de Python y no requiere ninguna instalación adicional.

A continuación se muestra un ejemplo de código que utiliza html.parser para analizar datos HTML:

from html.parser import HTMLParser

class MyHTMLParser(HTMLParser):
    def handle_starttag(self, tag, attrs):
        print("Encountered a start tag:", tag)
        
    def handle_endtag(self, tag):
        print("Encountered an end tag :", tag)
        
    def handle_data(self, data):
        print("Encountered some data  :", data)

parser = MyHTMLParser()

html_data = """
<html>
  <head><title>Example</title></head>
  <body><h1>Encabezado</h1><p>Párrafo.</p></body>
</html>
"""

parser.feed(html_data)

En este script, amplías la clase HTMLParser para crear un analizador HTML que gestiona las etiquetas de inicio, las etiquetas de fin y las visualizaciones de cada elemento.

Para utilizar este código, guárdelo en un archivo llamado htmlparser_example.py y ejecútelo con el siguiente comando desde su terminal o shell:

python3 htmlparser_example.py

La salida muestra cada etiqueta y datos:

…salida omitida…
Se encontró una etiqueta de inicio: html
Se encontraron algunos datos  : 
  
Se encontró una etiqueta de inicio: head
Se encontró una etiqueta de inicio: title
Se encontraron algunos datos  : Ejemplo
Se encontró una etiqueta de fin : title
Se encontró una etiqueta de fin : head
…salida omitida…

lxml

lxml es una opción muy popular para el Scraping web y la extracción de datos, ya que combina la potencia de las bibliotecas XML integradas con la facilidad de uso de Python.

Características y facilidad de uso

lxml es popular gracias a sus funciones eficientes y versátiles para navegar y analizar documentos HTML y XML. Ofrece funciones avanzadas de procesamiento XML, incluyendoXPath,XSLT y XPointer, lo que le permite extraer y transformar datos con precisión.

Al igual que Beautiful Soup, lxml admite estructuras de árbol, lo que facilita la navegación y el Parseo del contenido HTML. Si trabaja con contenido diverso, su capacidad para funcionar bien tanto con documentos formateados como con documentos mal formateados puede resultar útil.

Velocidad

lxml es bien conocido por su velocidad y eficiencia, gracias a la utilización de bibliotecas C comolibxml2ylibxslt. Esto hace que lxml sea más rápido que otras bibliotecas de parseo, especialmente cuando se manejan documentos extensos o tareas de parseo complejas, como la extracción de datos profundamente anidados de grandes tablas HTML.

lxml es una excelente opción para proyectos con plazos ajustados o que requieren el procesamiento de grandes cantidades de datos.

Compatibilidad con los estándares HTML más recientes

lxml puede manejar las últimas tecnologías web, incluidos los archivos HTML5 y el HTML mal estructurado. Esto hace que lxml sea una de las mejores opciones para tareas de Scraping web en las que la calidad y la estructura del HTML pueden variar.

Documentación y asistencia

lxml cuenta conuna documentación completacon ejemplos detallados que se adaptan a desarrolladores de todos los niveles. Además, puede buscar más información, consejos para la resolución de problemas y mejores prácticas en plataformas comoStack OverflowyGitHub.

Obtenga más información sobre el scraping web con lxml aquí.

Ejemplo de código

Para instalar lxml, ejecute lo siguiente:

pip3 install lxml

El siguiente ejemplo muestra cómo analizar datos HTML con lxml:

from lxml import html

html_content = """
<html>
  <body>
    <h1>¡Hola, mundo!</h1>
    <p>Este es un párrafo.</p>
  </body>
</html>
"""

tree = html.fromstring(html_content)

h1_text = tree.xpath('//h1/text()')[0]
print("Texto H1:", h1_text)

p_text = tree.xpath('//p/text()')[0]
print("Texto del párrafo:", p_text)

Aquí, se utiliza lxml para realizar el Parseo del contenido HTML y, a continuación, se extrae el texto de los elementos HTML con expresiones XPath.

Si quieres probar lxml, guarda este código en un archivo llamado lxml_example.py y luego ejecútalo con el siguiente comando desde tu shell o terminal:

python3 lxml_example.py

Deberías ver el texto de los elementos <h1> y <p> impreso de la siguiente manera:

Texto H1: ¡Hola, mundo!
Texto del párrafo: Este es un párrafo.

Si necesitas un analizador completo y listo para producción que pueda manejar la complejidad de las consultas XPath (como tipos en XML o elementos múltiples), debes usar lxml.

PyQuery

PyQuery es una bibliotecasimilar a jQuerypara Python que permite extraer páginas web completas en segundos.

Características y facilidad de uso

Similar a la sintaxis de jQuery, PyQuery es fácil de usar. Puede seleccionar elementos fácilmente, recorrerlos, actualizar su contenido y gestionar atributos HTML. Esto es especialmente útil cuando se trata de tareas como el Scraping web, en las que se desea extraer datos de páginas HTML y trabajar con ellos.

PyQuery también es compatible con selectores CSS, lo que facilita el inicio si ya estás familiarizado con la animación de documentos DOM utilizando jQuery.

Velocidad

PyQuery utiliza la biblioteca lxml para analizar HTML. Esto lo hace fácil de usar, pero más lento que si se utilizara lxml directamente.

Compatibilidad con los estándares HTML más recientes

PyQuery cumple con los últimos estándares HTML5 y, dado que utiliza lxml para el parseo, PyQuery puede manejar tanto HTML estructurado como no estructurado.

Documentación y asistencia

PyQuery proporcionauna documentacióncompleta que puede ayudarte a empezar rápidamente. Aunque tiene unacomunidad más pequeñaque otras bibliotecas, cuenta con el apoyo activo de más de cuarenta colaboradores. También hay otros recursos disponibles, como foros en línea, Stack Overflow y varios tutoriales, que pueden ayudarte si te encuentras con algún problema.

Ejemplo de código

Para instalar PyQuery, ejecute lo siguiente:

pip3 install pyquery

Aquí tienes un fragmento de código que utiliza pyquery para analizar datos HTML:

from pyquery import PyQuery as pq

html_content = """
<html>
  <body>
    <h1>¡Hola, desde PyQuery!</h1>
    <p>Este es un párrafo.</p>
  </body>
</html>
"""

doc = pq(html_content)

h1_text = doc('h1').text()
print("Texto H1:", h1_text)

p_text = doc('p').text()
print("Texto del párrafo:", p_text)

En este fragmento, se realiza el parseo del contenido HTML y luego se extrae el texto de elementos específicos.

Guarde este código en un archivo llamado pyquery_example.py y ejecútelo utilizando el siguiente comando desde su shell o terminal:

python3 pyquery_example.py

El resultado será similar a este:

Texto H1: ¡Hola, desde PyQuery!
Texto del párrafo: Este es un párrafo.

Si ya sabes cómo usar jQuery y buscas funciones similares, PyQuery es una excelente opción.

Scrapy

Scrapy es un marco de trabajo flexible y de código abierto para el Scraping web que permite a los usuarios crear y manejararañaspara recopilar información. Ofrece herramientas para gestionar todos los aspectos de una tarea de Scraping web, desde la gestión de solicitudes HTTP hasta el Parseo, el procesamiento y el almacenamiento de los datos extraídos. El marco de trabajo gestiona toda la complejidad que implican las tareas de Scraping web para que puedas centrarte en recopilar la información deseada.

Características y facilidad de uso

Scrapy está diseñado para ser fácil de usar y destaca en el parseo de datos web complejos con un marco modular. Ofrece selectores XPath y CSS para navegar por HTML y XML, e incluye utilidades como la limitación de solicitudes, la suplantación de agentes de usuario y la rotación de IP, que son esenciales para el scraping a gran escala.

Velocidad

Scrapy es eficiente. Sufuncionalidad de redle permite procesar solicitudes simultáneamente para recuperar datos. Esto resulta especialmente útil cuando se trabajan con conjuntos de datos a gran escala o cuando se desea extraer datos de sitios web comerciales.

Compatibilidad con los estándares HTML más recientes

Scrapy es compatible con los estándares HTML5 y puede manejar sitios web complejos, incluso aquellos que contienen JavaScript generado dinámicamente. Aunque Scrapy no procesa JavaScript por sí mismo, funciona junto con herramientas comoSeleniumpara gestionar páginas JavaScript.

Más información sobre cómo extraer contenido dinámico aquí.

Documentación y asistencia

Scrapy cuenta con una gran cantidad dedocumentacióny una comunidad muy activa que lo respalda. La documentación oficial cubre todo lo que necesitas saber sobre el uso básico y temas avanzados, e incluye numerosos ejemplos, guías y prácticas recomendadas para ayudar a desarrolladores de todos los niveles.

Además, la comunidad de Scrapy participa activamente a través de foros y repositorios de GitHub, lo que garantiza que puedas buscar ayuda y acceder a recursos para cualquier problema que se te presente.

Ejemplo de código

Para instalar Scrapy, ejecuta lo siguiente:

pip3 install scrapy

A continuación se muestra un ejemplo en el que se utiliza una araña de Scrapy para extraer datos:

import scrapy

class QuotesSpider(scrapy.Spider):
    name = "quotes"
    start_urls = [
        'http://quotes.toscrape.com/page/1/',
    ]

    def parse(self, response):
        for quote in response.css('div.quote'):
            yield {
                'text': quote.css('span.text::text').get(),
                'author': quote.css('small.author::text').get(),
                'tags': quote.css('div.tags a.tag::text').getall(),
            }

Este script define una clase spider, establece las URL de inicio y especifica cómo realizar Parseo en la respuesta para extraer datos.

Guarde este código en un archivo llamado quotes_spider.py y ejecútelo utilizando el siguiente comando desde su terminal o shell:

scrapy runspider quotes_spider.py -o quotes.json

Cuando ejecutas este código, Scrapy rastrea una página de Quotes to Scrape y extrae y analiza las citas de esta página con sus respectivos autores y etiquetas. A continuación, Scrapy guarda los datos extraídos en un archivoquotes.jsonque tiene este aspecto:

[
{"text": "u201cEl mundo tal y como lo hemos creado es un proceso de nuestro pensamiento. No puede cambiarse sin cambiar nuestro pensamiento.u201d", "author": "Albert Einstein", "tags": ["change", "deep-thoughts", "thinking", "world"]},
{"text": "u201cSon nuestras elecciones, Harry, las que muestran lo que realmente somos, mucho más que nuestras habilidades.u201d", "author": "J.K. Rowling", "tags": ["habilidades", "elecciones"]}
...salida omitida...
]

Para proyectos complejos de extracción web en los que se tienen necesidades específicas, Scrapy es una excelente opción gracias a sus herramientas con múltiples funciones y su escalabilidad.

Conclusión

En este artículo, has aprendido sobre cinco analizadores HTML para Python, incluidos Beautiful Soup, HTMLParser, lxml, PyQuery y Scrapy.

Beautiful Soup es ideal para principiantes debido a su simplicidad. HTMLParser es una opción ligera para necesidades básicas de parseo. lxml es una opción a tener en cuenta si busca un mejor rendimiento y compatibilidad con XPath. PyQuery aporta a Python una simplicidad similar a la de jQuery. Scrapy es el marco que debe utilizar si se enfrenta a proyectos de scraping a gran escala.

¿Quieres saltarte el scraping y obtener los datos? Echa un vistazo a nuestros Conjuntos de datos registrándote y descargando una muestra gratuita ahora mismo.