es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Python BeautifulSoup no extrae todas las URL.

Estoy tratando de encontrar todas las URLs en esta página: https://courses.students.ubc.ca/cs/courseschedule?pname=subjarea&tname=subj-all-departments

Más específicamente, quiero los enlaces que están hiperenlazados bajo cada “Código de materia”. Sin embargo, cuando ejecuto mi código, apenas se extraen enlaces.

Me gustaría saber por qué está ocurriendo esto y cómo puedo solucionarlo.

from bs4 import BeautifulSoup
import requests

url = "https://courses.students.ubc.ca/cs/courseschedule?pname=subjarea&tname=subj-all-departments"

page = requests.get(url)
soup = BeautifulSoup(page.text, features="lxml")

for link in soup.find_all('a'):
    print(link.get('href'))

Este es mi primer intento en web-scraping…

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema con tu código es que está encontrando todas las etiquetas de anclaje HTML (<a>) en la página e imprimiendo sus atributos href, sin importar la ubicación o el contexto de la etiqueta de anclaje.

    Para extraer solo las URL que están hiperenlazadas bajo cada “Código de Asignatura”, debes apuntar a esos elementos HTML específicos. Una forma de hacer esto es encontrar la tabla HTML (<table>) que contiene los códigos de asignatura y sus respectivos enlaces, y luego iterar a través de las filas (<tr>) y celdas (<td>) de la tabla.

    Aquí tienes un fragmento de código actualizado que debería lograr esto:

    from bs4 import BeautifulSoup
    import requests
    
    url = "https://courses.students.ubc.ca/cs/courseschedule?pname=subjarea&tname=subj-all-departments"
    
    page = requests.get(url)
    soup = BeautifulSoup(page.text, features="lxml")
    
    # Encuentra la tabla HTML que contiene los códigos de asignatura y enlaces
    table_curso = soup.find("table", attrs={"class": "table"})
    
    # Itera a través de cada fila y celda de la tabla para extraer los enlaces
    for fila in table_curso.find_all("tr"):
        celdas = fila.find_all("td")
        if len(celdas) > 1:
            codigo_asignatura = celdas[0].text.strip()
            enlace_asignatura = celdas[1].find("a").get("href")
            print(codigo_asignatura, enlace_asignatura)
    

    Este código encuentra la tabla HTML con clase table, luego itera a través de cada fila en la tabla. Para cada fila, verifica si hay al menos dos celdas (la primera celda es el código de asignatura y la segunda celda debería contener el hiperenlace). Si se encuentran dos celdas, extrae el texto del código de asignatura y la URL del atributo href de la etiqueta de anclaje en la segunda celda.

    ¡Espero que esto te ayude a extraer las URL que necesitas!

Comments are closed.