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.

Cómo extraer datos de tablas dinámicas (página web del Banco Mundial)

Estaba intentando extraer información del marco de resultados para varios proyectos en el sitio web del Banco Mundial. La biblioteca que estoy utilizando es scrapy, pero también estoy abierto a usar selenium.

Enlace: (https://projects.worldbank.org/en/projects-operations/project-detail/P153012)

El problema al que me enfrento es:

  1. Las tablas se generan dinámicamente y en algunos proyectos podrían estar completamente ausentes o tener menos campos (esto impide que pueda usar scrapy ya que no sé cómo manejar JavaScript usando scrapy).
  2. Con selenium, el código que estoy utilizando es el siguiente, pero esto solo me permite extraer todo el texto y no los elementos de celda individuales (¿se puede hacer lo mismo o simplemente estoy intentando hacer algo imposible?):
from selenium import webdriver

url = "https://projects.worldbank.org/en/projects-operations/project-detail/P153012"
driver = webdriver.Chrome(executable<em>path = "/Users/thenewcomputer/Downloads/chromedriver")
driver.get(url)
tables = driver.find_elements_by_class_name("ng-tns-c7-3")
for table in tables:
    title = table.find_elements_by_xpath('//*[@id="results"]/div/div/div[2]/div/div[1]/div/div/ul/li/table')
title
for x in title:
    print(x.text) #porque quería verificar si esto funcionaba correctamente

Por favor, avíseme si hay una forma más fácil de hacer esto y gracias de antemano.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Solución para Extraer la Información del Marco de Resultados del Sitio del Banco Mundial

    Problema

    El desafío al extraer la información del “Marco de Resultados” para diferentes proyectos en el sitio del Banco Mundial incluye:
    1. Las tablas se generan dinámicamente, y algunos proyectos pueden no tener todos los campos, lo que hace imposible utilizar Scrapy ya que no maneja la ejecución de JavaScript.
    2. Con Selenium, el código actual solo extrae todo el texto y no los elementos de celda individuales.

    Solución

    Puedes probar la siguiente solución:
    1. Usa Selenium con WebDriverWait para esperar a que se cargue el contenido dinámico antes de extraer datos de la página.
    2. Utiliza un selector Xpath para extraer elementos de celda individuales en lugar de obtener todo el texto.

    Aquí tienes un ejemplo de cómo usar Selenium con WebDriverWait para extraer información del Marco de Resultados del proyecto P153012:

    from selenium import webdriver
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.by import By
    
    url = "https://projects.worldbank.org/en/projects-operations/project-detail/P153012"
    driver = webdriver.Chrome(executable_path = "ruta/hacia/el/chromedriver")
    
    # Carga la página y espera a que se cargue la tabla
    driver.get(url)
    wait = WebDriverWait(driver, 10)
    table = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="results"]/div/div/div[2]/div/div[1]/div/div/ul/li/table/tbody')))
    
    # Extrae las celdas de la tabla
    rows = table.find_elements_by_tag_name('tr')
    for row in rows:
        cells = row.find_elements_by_tag_name('td')
        for cell in cells:
            print(cell.text)
    

    Este código esperará a que se cargue la tabla del Marco de Resultados y luego extraerá los elementos de celda individuales con un selector Xpath. Puedes modificar el selector Xpath para apuntar a otras tablas en la página.

Comments are closed.