data_processing.py 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. from bs4 import BeautifulSoup
  2. def process_html(html_doc):
  3. """
  4. Procesa el HTML de la página y extrae la información relevante
  5. como materias, estados del servicio social, etc.
  6. """
  7. soup = BeautifulSoup(html_doc, 'lxml')
  8. table = soup.find('table', attrs={'id': 'ctl00_contenedor_HistorialAlumno1_gvMaterias'})
  9. actualmente_cursadas = soup.find('table', attrs={'id': 'ctl00_contenedor_HistorialAlumno1_gvMatOrdinario'})
  10. if table is None:
  11. raise Exception("Tabla no encontrada en la página")
  12. elif actualmente_cursadas is None:
  13. raise Exception("Tabla de materias actualmente cursadas no encontrada en la página")
  14. materias_sgu = []
  15. headers = [header.text for header in table.find_all('th')]
  16. for row in table.find_all('tr'):
  17. cols = row.find_all('td')
  18. if cols and not any(col.text == "Promedio:" for col in cols):
  19. materias_sgu.append({ headers[i]: col.text for i, col in enumerate(cols) if not is_cell_empty(col.text) })
  20. materias_actualmente_cursadas = []
  21. headers = [header.text for header in actualmente_cursadas.find_all('th')]
  22. for row in actualmente_cursadas.find_all('tr'):
  23. cols = row.find_all('td')
  24. if cols and not any(col.text == "No hay Datos" for col in cols):
  25. materias_actualmente_cursadas.append({ headers[i]: col.text for i, col in enumerate(cols) if not is_cell_empty(col.text) })
  26. periodo_actual = soup.find('span', attrs={'id': 'ctl00_contenedor_HistorialAlumno1_Header1_lblPeriodo'})
  27. grupo_actual = soup.find('span', attrs={'id': 'ctl00_contenedor_HistorialAlumno1_Header1_lblgru'})
  28. return clean_materias_sgu(materias_sgu), clean_materias_sgu(materias_actualmente_cursadas), f"'{periodo_actual.text}'", f"'{grupo_actual.text}'"
  29. def is_cell_empty(cell_content):
  30. """
  31. Verifica si el contenido de una celda está vacío o contiene solo espacios.
  32. """
  33. return not cell_content.strip() or cell_content == u'\xa0'
  34. def clean_materias_sgu(materias_sgu):
  35. """
  36. Limpia y ajusta las materias obtenidas del SGU para su procesamiento posterior.
  37. """
  38. for materia in materias_sgu:
  39. if '\xa0' in materia:
  40. materia['SEMESTRE'] = materia.pop('\xa0')
  41. return materias_sgu
  42. # Puedes agregar más funciones según sea necesario para procesar otros aspectos del HTML