Herramientas de usuario

Herramientas del sitio


informatica:programacion:python:modulos:beautiful_soup

¡Esta es una revisión vieja del documento!


Python: Beautiful Soup

Biblioteca de Python para analizar documentos HTML y XML (incluyendo los que tienen un marcado incorrecto). Se utiliza para el Web scraping.

Instalación

pip install beautifulsoup4

También es necesario instalar requests para poder descargar contenido web, añadir cabeceras, etc.

pip install requests

Uso

Pasos:

  1. URL a analizar
  2. Descarga de la URL con requests (indicando cabeceras si es necesario).
  3. Conversión de la respuesta en un objeto de Beautiful Soup
  4. Búsqueda de los datos que queremos (find())
  5. Tratamiento del resultado para adaptarlo a nuestro gusto.

Si queremos usar la misma cabecera que la de nuestro navegador, podemos ir a la web http://www.xhaus.com/headers y anotar lo que ponga en User-Agent:

headers = {
    "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:85.0) Gecko/20100101 Firefox/85.0" 
}

Ejemplos

Amazon

import bs4
 
import requests # es el módulo que hará la descarga
 
# Para las webs que no permiten scraping, le hacemos creer que 
# nos estamos conectando con un navegador
headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36'}
 
res = requests.get("https://www.amazon.es/dp/B078211KBB/", headers = headers)
 
# Nos aseguramos de que no ha habido errores al descargar la web anterior
res.raise_for_status()
 
soup = bs4.BeautifulSoup(res.text, "html.parser")
 
titulo = soup.find("span", attrs={"id": "productTitle"}).string.strip()
 
try:
    # Precios normales
    precio = soup.find("span", attrs={'id':'priceblock_ourprice'}).string.strip()
 
except AttributeError:
    # Precios de oferta
    precio = soup.find("span", attrs={'id':'priceblock_dealprice'}).string.strip() 
 
# Se crea un objeto 'BeautifulSoup' donde se podrán hacer búsquedas
# utilizando selectores CSS, por ejemplo:
#elementos = soup.select('html head title')
 
print(titulo)
print(precio)
 
# Eliminamos el HTML quedándonos solo con el texto:
#elementos[0].text
 
# Quitamos también saltos de línea y espacios:
#elementos[0].text.strip()

Otro similar:

#! /usr/bin/env python
 
import requests
from bs4 import BeautifulSoup
import smtplib
 
headers = {
    "User-agent": 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'}
 
URL = 'https://www.amazon.es/Raspberry-PI-4B-8GB-RAM/dp/B0899VXM8F/ref=sr_1_6?__mk_es_ES=%C3%85M%C3%85%C5%BD%C3%95%C3%91&dchild=1&keywords=raspberry+pi&qid=1612905463&sr=8-6'
 
def amazon():
 
    page = requests.get(URL, headers=headers)
 
    soup = BeautifulSoup(page.content, 'html.parser')
 
    title = soup.find(id="productTitle").get_text()
    price = soup.find(id="priceblock_ourprice").get_text()
    sep = ','
    con_price = price.split(sep, 1)[0]
    converted_price = int(con_price.replace('.', ''))
 
    # título y precio
    print(title.strip())
    print(converted_price)
 
amazon()

Recursos

informatica/programacion/python/modulos/beautiful_soup.1718373327.txt.gz · Última modificación: por tempwin