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.

El elemento de Selenium ya no está adjuntado al DOM. Error al raspar una tabla dinámica.

Esta es mi primera experiencia en el raspado de paginación dinámica con Selenium.
Quiero raspar el siguiente sitio web. Básicamente, la idea es raspar todas las 118 páginas de la tabla y guardarlas en un archivo JSON.
Intenté obtener la primera tabla e imprimió perfectamente bien, pero cuando intenté ir al botón siguiente, lanzó una excepción.

     raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.StaleElementReferenceException: Message: The element reference of <tr class="even"> is stale; either the element is no longer attached to the DOM, it is not in the current frame context, or the document has been refreshed

Aquí hay una pequeña parte del código que he intentado hasta ahora:

driver = webdriver.Firefox(executable_path=GeckoDriverManager().install())
driver.get("https://merolagani.com/Floorsheet.aspx")
for z in (driver.find_elements(By.XPATH, '//tbody/tr')):
    table_data = z.find_elements_by_tag_name('td')
    for td in table_data:
        print(td.text)
        time.sleep(1)
    z.find_element(By.XPATH, "(//a[@title='Next Page'])[2]").click()

Es la primera vez que raspo paginación dinámica, cualquier ayuda será útil, gracias.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Raspado de paginación dinámica con Selenium

    Visión general

    Esta es una breve guía para expertos en TI especializados en Python, Selenium, Selenium-Webdriver y Web-Scraping. El objetivo es proporcionar asistencia para aquellos que son nuevos en el raspado de paginación dinámica utilizando Selenium.

    Declaración del problema

    El experto en TI está tratando de extraer datos de un sitio web (https://merolagani.com/Floorsheet.aspx) que contiene tablas distribuidas en 118 páginas. El objetivo es raspar todas las tablas y almacenar los datos en formato JSON. El experto en TI ha impreso exitosamente los datos de la primera tabla, pero se produce una excepción al intentar pasar a la siguiente página.

    Solución

    Selenium es una herramienta de automatización que interactúa con los navegadores web para simular acciones humanas. La función find_element() busca un solo elemento en la página web, mientras que la función find_elements() busca varios elementos.

    Cuando se raspan sitios web dinámicos, la función find_element() puede causar una StaleElementReferenceException, que ocurre cuando el DOM cambia y el elemento previamente referenciado ya no está disponible. Esta solución involucra usar find_elements() para almacenar todos los datos de la tabla y luego iterar a través de las filas de la tabla haciendo clic en el botón “Siguiente”.

    Aquí está el código modificado que aborda el problema:

    driver = webdriver.Firefox(executable_path=GeckoDriverManager().install())
    driver.get("https://merolagani.com/Floorsheet.aspx")
    
    table_data = driver.find_elements(By.XPATH, "//tbody/tr")
    
    for z in table_data:
        td = z.find_elements(By.TAG_NAME, "td")
        for data in td:
            print(data.text)
            time.sleep(1)
    
    while True:
        try:
            next_button = driver.find_element(By.XPATH, "(//a[@title='Siguiente página'])[2]")
            time.sleep(1)
            next_button.click()
            table_data = driver.find_elements(By.XPATH, "//tbody/tr")
            for z in table_data:
                td = z.find_elements(By.TAG_NAME, "td")
                for data in td:
                    print(data.text)
                    time.sleep(1)
        except NoSuchElementException:
            print("Raspado completado")
            break
    

    El código anterior almacena todos los datos de la primera página en la variable table_data utilizando la función find_elements. Luego, el script itera sobre cada fila de la tabla e imprime los datos en la consola.

    El bucle while encuentra el botón “Siguiente” utilizando la función find_element() y hace clic en él. Luego espera un segundo para dar suficiente tiempo a la tabla para que se cargue. Luego encuentra todas las filas en la tabla utilizando la función find_elements e itera sobre cada fila para imprimir los datos en la consola.

    La excepción NoSuchElementException se lanza cuando no hay más botones “Siguiente” y el bucle while responde rompiendo el ciclo e imprimiendo “Raspado completado” en la consola.

    Conclusión

    Los sitios web dinámicos a menudo requieren raspado web utilizando herramientas de automatización como Selenium. Sin embargo, se debe tener cuidado al raspar estos sitios web debido a que los elementos del DOM pueden cambiar, lo que provoca que se lancen excepciones. Esta guía proporciona un enfoque que tiene en cuenta esas complicaciones y debería ayudar a los expertos en TI especializados en el raspado de paginación dinámica utilizando Selenium.

Comments are closed.