Obtener elemento de una web con Python

obtener cualquier elemento de una web con python

Obtener un elemento html de una página web con Python es muy sencillo aplicando la técnica de web scraping gracias a dos módulos, Beautiful Soup y Urllib3

 

Qué es la técnica web scrapping

Web scraping es una técnica para extraer información de los sitios web, que se centra en la transformación de los datos no estructurados en la web.

En general, este tipo de programas simulan la exploración humana de la World Wide Web, ya sea con la implementación del HTTP o con la incorporación de un navegador web.

Módulo Beautiful Soup

Beautiful Soup es una librería Python para obtener datos de HTML, XML y otros lenguajes de marcado.

Instalar el módulo es muy sencillo, utilizando el gestor de paquetes de Python (pip) como en otras ocasiones, basta con ejecutar el siguiente comando:

pip install beautifulsoup4

Módulo urllib3

Urllib3 es un cliente HTTP potente y amigable para Python que, trae muchas características que faltan en las bibliotecas estándar de Python, como las siguientes:

  • Hilo de seguridad.
  • Agrupación de conexiones.
  • Verificación SSL / TLS del lado del cliente.
  • Carga de archivos con codificación multiparte.
  • Ayudantes para reintentar las solicitudes y tratar con redireccionamientos HTTP.
  • Soporte para codificación gzip y desinflar.
  • Soporte de proxy para HTTP y SOCKS.

La instalación es igual que la anterior, ejecutando el siguiente comando:

pip install urllib3

Obtener html con Beautiful Soup

Ahora vamos a ver un ejemplo, en el cuál obtendremos el HTML de la página web que indiquemos.

from bs4 import BeautifulSoup
import urllib3


url = "https://www.python.org/"
http = urllib3.PoolManager() # Peticion http
r = http.request("GET", url) # Respuesta 
html = BeautifulSoup(r.data, "html5lib") # Obtencion del html
print(html)

Los pasos que se siguen en el código anterior son los siguientes:

  1. Designar la url de la que queremos obtener el HTML.
  2. Realizar la petición HTTP.
  3. Recibir la respuesta a la petición.
  4. Obtener el HTML a partir de la respuesta a la petición.

Obtener cualquier elemento html de un web con Python

El lenguaje de marcado HTML se basa en etiquetas y existen muchas (puedes ver todas aquí). Lo que vamos a hacer en el siguiente ejemplo es obtener el elemento que queramos de la web que introduzcamos con un sencillo programa en Python, introduciendo por teclado la etiqueta HTML que queramos obtener.

El siguiente código muestra una función que retornará una tupla con los resultados encontrados a partir de la etiqueta suministrada:

def get_element(url):
    try:
        # Evitar InsecureRequestWarning
        urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
        http = urllib3.PoolManager()
        r = http.request("GET", url)
        html = BeautifulSoup(r.data, "html.parser")
        tag = input('Introduzca la etiqueta \n> ')
        return html.find_all(tag)
    except Exception as e:
        print("Se ha producido un error: ",e)

El código es muy parecido al del anterior ejemplo, pero esta vez usamos una función de Beautiful Soup para buscar todas las ocurrencias del elemento que pasemos.

La función sigue estos pasos:

  • La invocamos con una determinada url
  • Hacemos la petición HTTP
  • Recibimos el HTML
  • Pedimos por teclado la etiqueta que queremos buscar
  • Retornamos lo que encuentra la función find_all de Beautiful Soup

Además, en el programa también estamos haciendo un control de excepciones básico, que puedes modificar según tus necesidades. Por ejemplo, podrías poner una llamada recursiva de la propia función pidiendo otra url, ya que, la mayoría de errores vendrán por urls erróneas.

A continuación, se puede ver una posible ejecución de la función:

url = "https://www.python.org/"
elements = get_element(url)
for e in elements:
    print(e)

Llamamos a la función con la url del sitio oficial de Python y luego imprimimos los elementos contenidos en la tupla que hemos obtenido como resultado de la búsqueda con nuestra función get_element().

Deja un comentario