informatica:programacion:python:modulos:beautiful_soup
Diferencias
Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previa | ||
| informatica:programacion:python:modulos:beautiful_soup [2021/02/09 22:03] – [Instalación] tempwin | informatica:programacion:python:modulos:beautiful_soup [2024/06/14 17:24] (actual) – [Recursos] tempwin | ||
|---|---|---|---|
| Línea 4: | Línea 4: | ||
| * [[https:// | * [[https:// | ||
| + | * [[https:// | ||
| Línea 18: | Línea 19: | ||
| </ | </ | ||
| + | ===== Uso ===== | ||
| + | |||
| + | Pasos: | ||
| + | |||
| + | - URL a analizar | ||
| + | - Descarga de la URL con '' | ||
| + | - Conversión de la respuesta en un objeto de Beautiful Soup | ||
| + | - Búsqueda de los datos que queremos ('' | ||
| + | - 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:// | ||
| + | |||
| + | <code python> | ||
| + | headers = { | ||
| + | " | ||
| + | } | ||
| + | </ | ||
| + | ===== Ejemplos ===== | ||
| + | |||
| + | ==== Amazon ==== | ||
| + | |||
| + | <code python> | ||
| + | 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 = {' | ||
| + | |||
| + | res = requests.get(" | ||
| + | |||
| + | # Nos aseguramos de que no ha habido errores al descargar la web anterior | ||
| + | res.raise_for_status() | ||
| + | |||
| + | soup = bs4.BeautifulSoup(res.text, | ||
| + | |||
| + | titulo = soup.find(" | ||
| + | |||
| + | try: | ||
| + | # Precios normales | ||
| + | precio = soup.find(" | ||
| + | |||
| + | except AttributeError: | ||
| + | # Precios de oferta | ||
| + | precio = soup.find(" | ||
| + | |||
| + | # Se crea un objeto ' | ||
| + | # utilizando selectores CSS, por ejemplo: | ||
| + | #elementos = soup.select(' | ||
| + | |||
| + | print(titulo) | ||
| + | print(precio) | ||
| + | |||
| + | # Eliminamos el HTML quedándonos solo con el texto: | ||
| + | # | ||
| + | |||
| + | # Quitamos también saltos de línea y espacios: | ||
| + | # | ||
| + | </ | ||
| + | |||
| + | Otro similar: | ||
| + | |||
| + | <code python> | ||
| + | #! / | ||
| + | |||
| + | import requests | ||
| + | from bs4 import BeautifulSoup | ||
| + | import smtplib | ||
| + | |||
| + | headers = { | ||
| + | " | ||
| + | |||
| + | URL = ' | ||
| + | |||
| + | def amazon(): | ||
| + | |||
| + | page = requests.get(URL, | ||
| + | |||
| + | soup = BeautifulSoup(page.content, | ||
| + | |||
| + | title = soup.find(id=" | ||
| + | price = soup.find(id=" | ||
| + | sep = ',' | ||
| + | con_price = price.split(sep, | ||
| + | converted_price = int(con_price.replace(' | ||
| + | |||
| + | # título y precio | ||
| + | print(title.strip()) | ||
| + | print(converted_price) | ||
| + | |||
| + | amazon() | ||
| + | </ | ||
| + | ===== Ejemplo 2: leyendo HTML de una web ===== | ||
| + | |||
| + | <code python> | ||
| + | from bs4 import BeautifulSoup | ||
| + | import requests | ||
| + | |||
| + | url = " | ||
| + | |||
| + | result = requests.get(url) | ||
| + | |||
| + | # Contenido de la petición | ||
| + | # print(result.text) | ||
| + | |||
| + | doc = BeautifulSoup(result.text, | ||
| + | |||
| + | # Mostrarlo bien sangrado | ||
| + | # print(doc.prettify()) | ||
| + | |||
| + | """ | ||
| + | Buscar por un texto (y aprovechar el resultado para obtener el elemento padre) | ||
| + | Queremos llegar a un precio que comienza por el signo " | ||
| + | """ | ||
| + | |||
| + | prices = doc.find_all(text=" | ||
| + | parent = prices[0].parent | ||
| + | strong = parent.find(" | ||
| + | print(strong.string) | ||
| + | </ | ||
| + | |||
| + | ===== Búsquedas ===== | ||
| + | |||
| + | * '' | ||
| + | * '' | ||
| + | |||
| + | Podemos buscar más de un elemento a la vez: | ||
| + | |||
| + | <code python> | ||
| + | doc.find_all([" | ||
| + | </ | ||
| + | |||
| + | Podemos buscar un elemento que tenga cierto texto: | ||
| + | |||
| + | <code python> | ||
| + | doc.find_all([" | ||
| + | </ | ||
| + | |||
| + | Buscar atributos de cierto elemento, por ejemplo el atributo '' | ||
| + | |||
| + | <code python> | ||
| + | doc.find_all([" | ||
| + | </ | ||
| + | |||
| + | Búsqueda por clases CSS: | ||
| + | |||
| + | <code python> | ||
| + | tag = doc.find_all(class_=" | ||
| + | </ | ||
| + | |||
| + | <WRAP center round info 60%> | ||
| + | '' | ||
| + | </ | ||
| + | |||
| + | Búsqueda por expresión regular: | ||
| + | |||
| + | <code python> | ||
| + | import re | ||
| + | |||
| + | # Buscar un signo de dólar y lo que venga después | ||
| + | tags = doc.find_all(text=re.compile(" | ||
| + | </ | ||
| + | |||
| + | Limitar los resultados de búsqueda: | ||
| + | |||
| + | <code python> | ||
| + | import re | ||
| + | |||
| + | # Buscar un signo de dólar y lo que venga después | ||
| + | tags = doc.find_all(text=re.compile(" | ||
| + | </ | ||
| + | |||
| + | Búsqueda por proximidad en la estructura de árbol, por ejemplo, nodos hermanos, padre y descendientes: | ||
| + | |||
| + | <code python> | ||
| + | from bs4 import BeautifulSoup | ||
| + | import requests | ||
| + | |||
| + | url = " | ||
| + | result = requests.get(url).text | ||
| + | doc = BeautifulSoup(result, | ||
| + | |||
| + | tbody = doc.tbody | ||
| + | trs = tbody.contents | ||
| + | |||
| + | print(trs[1].next_sibling) | ||
| + | |||
| + | # Nodo padre: | ||
| + | print(trs[0].parent) | ||
| + | |||
| + | # Descendientes | ||
| + | print(trs[0].descendants) | ||
| + | # | ||
| + | # | ||
| + | </ | ||
| + | |||
| + | Recorrer una tabla buscando precios: | ||
| + | |||
| + | <code python> | ||
| + | from bs4 import BeautifulSoup | ||
| + | import requests | ||
| + | |||
| + | url = " | ||
| + | result = requests.get(url).text | ||
| + | doc = BeautifulSoup(result, | ||
| + | |||
| + | tbody = doc.tbody | ||
| + | trs = tbody.contents | ||
| + | |||
| + | prices = {} | ||
| + | |||
| + | for tr in trs[:10]: | ||
| + | for td in tr.contents: | ||
| + | name, price = tr.contents[2: | ||
| + | fixed_name = name.p.string | ||
| + | fixed_price = price.a.string | ||
| + | | ||
| + | prices[fixed_name] = fixed_price | ||
| + | | ||
| + | print(prices) | ||
| + | </ | ||
| ===== Recursos ===== | ===== Recursos ===== | ||
| * [[https:// | * [[https:// | ||
| + | * [[https:// | ||
informatica/programacion/python/modulos/beautiful_soup.1612904585.txt.gz · Última modificación: por tempwin
