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: