Skip to content

Commit 94aad84

Browse files
authored
Merge pull request #6810 from Maanghel/main
#18 - Python
2 parents ca8393c + faaa260 commit 94aad84

File tree

1 file changed

+101
-0
lines changed
  • Retos/Reto #18 - WEB SCRAPING [Difícil]/python

1 file changed

+101
-0
lines changed
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
"""
2+
El día 128 del año celebramos en la comunidad el "Hola Mundo day"
3+
Vamos a hacer "web scraping" sobre su sitio web: https://holamundo.day
4+
5+
Crea un programa que se conecte a la web del evento e imprima únicamente la agenda de eventos
6+
del día 8. Mostrando hora e información de cada uno.
7+
Ejemplo: "16:00 | Bienvenida"
8+
9+
Se permite utilizar librerías que nos faciliten esta tarea.
10+
"""
11+
12+
import re
13+
from bs4 import BeautifulSoup
14+
import requests
15+
16+
URL = "https://holamundo.day"
17+
EVENT_CLASS = "rt-Text rt-r-size-4"
18+
TIME_PATTERN = re.compile(r"^(?:[01]\d|2[0-3]):[0-5]\d$")
19+
20+
def get_html(url: str) -> str:
21+
"""
22+
Realiza una petición HTTP a la URL especificada y devuelve el contenido HTML.
23+
24+
Parámetros:
25+
url (str): Dirección web a la que se realizará la solicitud.
26+
27+
Retorna:
28+
str: El contenido HTML de la página.
29+
30+
Lanza:
31+
ConnectionError: Si ocurre un problema de red o conexión.
32+
"""
33+
try:
34+
response = requests.get(url, timeout=5)
35+
response.raise_for_status()
36+
return response.text
37+
except requests.exceptions.RequestException as e:
38+
raise ConnectionError(f"No se pudo conectar a {url}.") from e
39+
40+
def get_events(html: str) -> list[tuple[str, str]]:
41+
"""
42+
Procesa el HTML de la página y extrae los eventos del día 8.
43+
44+
Parámetros:
45+
html (str): Contenido HTML de la página.
46+
47+
Retorna:
48+
list[tuple[str, str]]: Lista de tuplas (hora, descripción).
49+
50+
Lanza:
51+
ValueError: Si no se encuentra la estructura esperada en la página.
52+
"""
53+
soup = BeautifulSoup(html, "html.parser")
54+
eventos_span = soup.find_all("span", class_=EVENT_CLASS)
55+
56+
if not eventos_span:
57+
raise ValueError("No se encontro la estructura de eventos en la página.")
58+
59+
eventos = []
60+
for span in eventos_span:
61+
strong = span.find("strong")
62+
if strong:
63+
hora = strong.get_text(strip=True)
64+
descripcion = span.get_text(strip=True).replace(hora, "", 1).strip()
65+
if TIME_PATTERN.fullmatch(hora):
66+
eventos.append((hora, descripcion))
67+
68+
return eventos
69+
70+
def print_events(eventos: list[tuple[str, str]]) -> None:
71+
"""
72+
Imprime la lista de eventos en formato legible.
73+
74+
Parámetros:
75+
eventos (list[tuple[str, str]]): Lista de tuplas (hora, descripción).
76+
"""
77+
if not eventos:
78+
print("No se encontraron eventos en la agenda.")
79+
return
80+
81+
for hora, descripcion in eventos:
82+
print(f"{hora} | {descripcion}")
83+
84+
85+
def get_agenda_day8() -> None:
86+
"""
87+
Función principal: obtiene e imprime la agenda de eventos del día 8.
88+
Maneja excepciones y muestra mensajes claros al usuario.
89+
"""
90+
try:
91+
html = get_html(URL)
92+
events = get_events(html)
93+
print_events(events)
94+
except (ConnectionError, ValueError) as e:
95+
print(f"Error: {e}")
96+
except Exception as e:
97+
print(f"Ocurrió un error inesperado: {e}")
98+
99+
100+
if __name__ == "__main__":
101+
get_agenda_day8()

0 commit comments

Comments
 (0)