Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Python
Code

Raspando Páginas Web en Python Con Beautiful Soup: Los Básicos

by
Difficulty:IntermediateLength:MediumLanguages:
This post is part of a series called Scraping Webpages in Python with Beautiful Soup.
Scraping Webpages in Python With Beautiful Soup: Search and DOM Modification

Spanish (Español) translation by Rafael Chavarría (you can also view the original English article)

En un tutorial anterior, te mostré cómo usar el módulo de Peticiones para acceder a páginas web usando Python. El tutorial cubrió muchos temas como hacer peticiones GET/POST y descargar cosas como mensajes o PDFs con programación. La única cosa que falta de ese tutorial fue una guía sobre raspar páginas web que accediste usando Peticiones para extraer la información que necesitas.

En este tutorial, aprenderás sobre Beautiful Shop, que es una librería Python para extraer datos desde sitios HTML. El enfoque de este tutorial será aprender los básicos de la librería, y temas más avanzados serán cubiertos en el siguiente tutorial. Por favor nota que este tutorial usa Beautiful Soup 4 para todos los ejemplos.

Instalación

Puedes instalar Beautiful Soup 4 usando pip. El nombre del paquete es beautifulsoup4. Debería funcionar en Python 2 y Python 3.

Si no tienes pip instalado en tu sistema, puedes descargarlo directamente el tarball fuente Beautiful Soup 4 e instalarlo usando setup.py.

BeautifulSoup está empacado originalmente como código Python 2. Cuando lo instalas para usar con Python 3, se actualiza automáticamente a código Python 3. El código no será convertido a menos que instales el paquete. Aquí están los errores comunes que podrías notar:

  • El “No module named HTMLParser” ImportError ocurre cuando estás ejecutando la versión Python 2 del código bajo Python 3.
  • El “No module named html.parser” ImportError ocurre cuando estás ejecutando la versión Python 3 bajo el código Python 2.

Ambos errores de arriba pueden ser corregidos des-instalando y re-instalando Beautiful Soup.

Instalando un Parser

Antes de discutir las diferencias entre diferentes parsers que puedes usar con Beautiful Shop, escribamos el código para crear un soup.

El objeto BeautifulSoup puede aceptar dos argumentos. El primer argumento es el marcado actual, y el segundo argumento es el parser que quieres usar. Los diferentes parsers son: html.parser, lxml, y html5lib. El parser lxml tiene dos versiones, un parser HTML y un parser XML.

El html.parser es un parser integrado, y no funciona en versiones más antiguas de Python. Puedes instalar los otros parsers usando los siguientes comandos:

El parser lxml es muy rápido y puede ser usado para analizar rápidamente HTML dado. Por el otro lado, el parser html5lib es muy lento, pero también extremadamente indulgente. Aquí hay un ejemplo de usar cada uno de estos parsers:

Las diferencias delineadas en el ejemplo de arriba solo importan cuando estás analizando HTML válido. Sin embargo, la mayoría del HTML en la web está mal formado, y conocer estas diferencias te ayudará a depurar algunos errores de análisis y a decidir cuál parser quieres usar en un proyecto. Generalmente, el parser lxml es una muy buena elección. 

Objetos en Beautiful Soup

Beautiful Soup analiza el documento HTML dado en un árbol de objetos Python. Hay cuatro objetos Python principales de los que necesitas saber: TagNavigableStringBeautifulSoup, y Comment.

El objeto Tag se refiere a una etiqueta XML o HTML real en el documento.Puedes acceder al nombre de una etiqueta usando tag.name. También puedes establecer el nombre de la etiqueta a algo más. El cambio de nombre será visible en el marcado generado por Beautiful Soup.

Puedes acceder a distintos atributos como la clase y id de una etiqueta usando tag['class'] y tag['id'] respectivamente. Puedes también acceder al diccionario completo de atributos usando tag.attrs. También puedes agregar, quitar o modificar atributos de etiqueta. Los atributos como la class de un elemento que puede tomar múltiples valores son almacenados como una lista.

El texto dentro de una etiqueta es almacenado como un NavigableString en Beautiful Soup. Tiene unos cuántos métodos útiles como replace_with("string") para reemplazar el texto dentro de una etiqueta. También puedes convertir un NavigableString a cadena unicode usando unicode().

Beautiful Shop también te permite acceder a los comentarios en una página web. Estos comentarios son almacenados como un objeto Comment, que básicamente también es un NavigableString.

Ya has aprendido sobre el objeto BeautifulSoup en la sección anterior. Este es usado para representar el documento como un todo. Ya que no es un objeto real, no tiene ningún nombre o atributos.

Obteniendo el Título, Encabezados y Enlaces

Puedes extraer el título de la página y otros datos muy fácilmente usando Beautiful Soup. Raspemos la página Wikipedia sobre Python. Primero, tendrás que obtener el marcado de la página usando el siguiente código basado en el tutorial del módulo Peticiones para acceder páginas web.

Ahora que has creado el soup, puedes obtener el título de la página web usando el siguiente código:

También puedes raspar la página web por otra información como el encabezado principal o el primer párrafo, sus clases, o el atributo id.

De manera similar, puedes iterar a través de todos los enlaces o sub-encabezados en un documento usando el siguiente código:

Navegando el DOM

Puedes navegar a través del árbol DOM usando nombres regulares de etiquetas. Cambiar estos nombres de etiqueta puede ayudarte a navegar el árbol más profundamente. Por ejemplo, puedes obtener el primer enlace en el primer párrafo de la página Wikipedia dada usando soup.p.a. Todos los enlaces en el primer párrafo pueden ser accedidos usando soup.p.find_all('a').

También puedes acceder a todos los hijos de una etiqueta como una lista usando tag.contents. Para obtener el hijo en un índice específico, puedes usar tag.contents[index]. También puedes iterar sobre el hijo de una etiqueta usando el atributo .children.

Ambos .children y .contents son útiles solo cuando quieres acceder a los descendientes directos de primer nivel de una etiqueta. Para obtener todos los descendientes, puedes usar el atributo .descendants.

Puedes también acceder al padre de un elemento usando el atributo .parent. De manera similar, puedes acceder a todos los ancestros de un elemento usando el atributo .parents. El padre de la etiqueta <html> de nivel superior es el Objeto BeautifulSoup mismo, y su padre es None.

Puedes acceder a los hijo anterior y siguiente de un elemento usando los atributos .previous_sibling y .next_sibling.

Para que dos elementos sean hermanos, deben tener el mismo padre. Esto significa que el primer hijo de un elemento no tendrá un hermano anterior. De manera similar, el último hijo del elemento no tendrá un hermano siguiente. En páginas web reales, los hermanos anterior y siguiente de un elemento probablemente serán un caracter de nueva línea.

También puedes iterar sobre todos los hermanos de un elemento usando .previous_siblings y .next_siblings.

También puedes ir al elemento que viene inmediatamente después del elemento actual usando el atributo .next_element. Para acceder al elemento que viene inmediatamente después del elemento actual, usa el atributo .previous_element.

De manera similar, puedes iterar sobre todos los elementos que vienen antes y después del elemento actual usando .previous_elements.next_elements respectivamente.

Ideas Finales

Después de completar este tutorial, deberías ahora tener un buen entendimiento de las diferencias principales entre diferentes parsers HTML. Deberías también poder navegar a través de una página web y extraer datos importantes. Esto puede ser de ayuda cuando quieres analizar todos los encabezados o enlaces de un sitio web dado.

En la siguiente parte de la serie, aprenderás cómo usar la librería Beautiful Soup para buscar y modificar el DOM.

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.