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 ===== | ===== Ejemplos ===== | ||
| Línea 41: | Línea 59: | ||
| try: | try: | ||
| - | # Precios normales | + | |
| - | precio = soup.find(" | + | precio = soup.find(" |
| except AttributeError: | except AttributeError: | ||
| - | # Precios de oferta | + | |
| - | precio = soup.find(" | + | precio = soup.find(" |
| # Se crea un objeto ' | # Se crea un objeto ' | ||
| Línea 60: | Línea 78: | ||
| # Quitamos también saltos de línea y espacios: | # 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.1612904609.txt.gz · Última modificación: por tempwin
