Saltar al contenido

Extracción de datos de un sitio web que utiliza Power BI: recuperar datos de Power BI en un sitio web

Solución:

Dejando a un lado la parte de desplazamiento y el JSON, logré leer los datos. La clave es leer todos los elementos dentro del padre (que se hace en la pregunta):

parent = driver.find_element_by_xpath('//*[@id="pvExplorationHost"]/div/div/div/div[2]/div/div[2]/div[2]/visual-container[4]/div/div[3]/visual/div')
children = parent.find_elements_by_xpath('.//*')

Luego, ordénelos usando su ubicación:

x = [child.location['x'] for child in children]
y = [child.location['y'] for child in children]
index = np.lexsort((x,y))

Para ordenar lo que hemos leído en diferentes líneas, este código puede ayudar:

rows = []
row = []
last_line = y[index[0]]
for i in index:
    if last_line != y[i]:
        row.append[children[i].get_attribute('title')]
    else:
        rows.append(row)
        row = list([children[i].get_attribute('title')]
rows.append(row)

Algunos detalles más sobre exactamente qué datos está tratando de eliminar habrían ayudado a construir una respuesta canónica. Sin embargo, para raspar los datos dentro del Mercancía y Base utilizando selenio, ya que el elemento deseado está dentro de un <iframe> entonces tienes que:

  • Inducir WebDriverWait para el deseado frame_to_be_available_and_switch_to_it().
  • Inducir WebDriverWait para el deseado visibility_of_element_located() para la mesa.
  • Inducir WebDriverWait para el deseado visibility_of_all_elements_located() para los datos deseados.
  • Puede utilizar las siguientes estrategias de localización:

    • Bloque de código:

      from selenium import webdriver
      from selenium.webdriver.common.by import By
      from selenium.webdriver.support.ui import WebDriverWait
      from selenium.webdriver.support import expected_conditions as EC
      
      options = webdriver.ChromeOptions() 
      options.add_argument("start-maximized")
      options.add_experimental_option("excludeSwitches", ["enable-automation"])
      options.add_experimental_option('useAutomationExtension', False)
      driver = webdriver.Chrome(options=options, executable_path=r'C:UtilityBrowserDriverschromedriver.exe')
      driver.get("https://ahdb.org.uk/cereals-oilseeds/feed-ingredient-prices")
      WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.TAG_NAME,"iframe")))
      WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div.innerContainer")))
      print("Commodity:")
      print([my_elem.text for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//div[@class="pivotTableCellWrap cell-interactive tablixAlignLeft " and starts-with(@title, 'Ex-')]//parent::div//preceding::div[1]")))])
      print("-=-=-=-=-=-")
      print("Basis:")
      print([my_elem.text for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "div.pivotTableCellWrap.cell-interactive.tablixAlignLeft[title^='Ex-']")))])
      
    • Salida de consola:

      Commodity:
      ['Argentine Sunflowermeal 32/33%', 'Maize Gluten Feed', 'Pelleted Wheat Feed', 'Rapemeal (34%)', 'Soyameal (Hi Pro)', 'Soyameal, Brazilian (48%)']
      -=-=-=-=-=-
      Basis:
      ['Ex-Store Liverpool', 'Ex-Store Liverpool', 'Ex-Mill Midlands and Southern Mills', 'Ex-Mill Erith', 'Ex-Store East Coast', 'Ex-Store Liverpool']
      

Actualización (según la explicación de la recompensa)

Según su comentario, así como el enlace proporcionado en la explicación de la recompensa, para extraer los datos de Página 2 dentro de la tabla debajo del encabezado Ubicación de exploración utilizando selenio, puede utilizar la siguiente solución. En aras de la demostración, he creado un Lista de la primera 20 países y puede expandirse tanto como desee:

  • Bloque de código:

    from selenium import webdriver
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
    options = webdriver.ChromeOptions() 
    options.add_argument("start-maximized")
    options.add_experimental_option("excludeSwitches", ["enable-automation"])
    options.add_experimental_option('useAutomationExtension', False)
    driver = webdriver.Chrome(options=options, executable_path=r'C:WebDriverschromedriver.exe')
    driver.get("https://app.powerbi.com/view?r=eyJrIjoiMzE1ODNmYzQtMWZhYS00NTNjLTg1MDUtOTQ2MGMyNDVkZTY3IiwidCI6IjE2M2FjNDY4LWFiYjgtNDRkMC04MWZkLWQ5ZGIxNWUzYWY5NiIsImMiOjh9")
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//span[@class="navigation-wrapper navigation-wrapper-big"]//i[@title="Next Page"]"))).click()
    print("Country:")
    print([my_elem.text for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//div[@class="bodyCells"]//div[@class="pivotTableCellWrap cell-interactive "]")))[:20]])
    driver.quit()
    
  • Salida de consola:

    DevTools listening on ws://127.0.0.1:49438/devtools/browser/1b5a2590-5a90-47fd-93c7-cfcf58a6c241
    Country:
    ['Myanmar', 'Myanmar', 'Mozambique', 'Malawi', 'Malawi', 'Mozambique', 'Malawi', 'Malawi', 'Malawi', 'Malawi', 'Malawi', 'Malawi', 'Malawi', 'Malawi', 'Malawi', 'Malawi', 'Malawi', 'Myanmar', 'Myanmar', 'Myanmar']
    
  • Instantánea de salida de la consola:

país

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *