Raspar de forma iterativa elementos de datos HTML seleccionados en cada opción de una lista desplegable.
Estoy tratando de extraer algunos elementos de una página HTML. Y las opciones deben seleccionarse de una lista desplegable y luego iterar. Pero siempre obtengo el elemento de la primera opción en la lista desplegable. Supongo que es porque mi función de clic no está funcionando correctamente. ¿Cómo es posible iterar a través de todas las opciones y seleccionar los elementos para crear los datos?
import pandas as pd
from selenium import webdriver
import re
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
import time
service = Service("/home/ubuntu/selenium_drivers/chromedriver")
base_url = 'https://www.crave.ca/en/tv-shows/16-and-pregnant'
page_one = True
options = webdriver.ChromeOptions()
options.add_argument("--headless")
driver = webdriver.Chrome(service=service, options=options)
driver.get(base_url)
driver.find_element(By.XPATH,'//*[@id="dropdown-basic"]').click()
time.sleep(5)
total_seasons = driver.find_elements(By.CSS_SELECTOR,'button.dropdown-item')
driver.find_element(By.XPATH,'//*[@id="dropdown-basic"]').click()
print(len(total_seasons))
d=[]
for i in range(0,len(total_seasons)):
alleps = driver.find_elements(By.XPATH,'//*[@id="episodes"]/div/ul/li')
for j in range(1,len(alleps)+1):
d.append({
'Duration': driver.find_element(By.XPATH,f'//*[@id="episodes"]/div/ul/li[{j}]/div[1]/div[2]/span/span[1]').text,
'Episode_Number': j,
'Episode_Synopsis': driver.find_element(By.XPATH,f'//*[@id="episodes"]/div/ul/li[{j}]/div[1]/div[2]/p').text,
'Episode_Title': re.sub(r'[^a-zA-Z ]+', '', driver.find_element(By.XPATH,f'//*[@id="episodes"]/div/ul/li[{j}]/div[1]/div[2]/h3').text).strip(),
})
data = pd.DataFrame.from_dict(d)
davy.ai
El problema parece estar en la función
click
para las opciones del menú desplegable. Una posible solución es utilizar un bucle para iterar a través de todas las opciones del menú desplegable y seleccionar cada opción antes de extraer los datos.Aquí hay un ejemplo de cómo modificar el código para implementar esta solución:
En este código modificado, primero encontramos las opciones del menú desplegable y las almacenamos en la variable
dropdown_options
. Luego, iteramos a través de cada opción, la seleccionamos haciendo clic en ella, esperamos a que se cargue la página y luego extraemos los datos de esa página. Los datos extraídos se añaden a la listad
, que luego se utiliza para crear un marco de datos de pandas como antes.Con estos cambios, el código debería iterar a través de todas las opciones del menú desplegable y extraer los datos de cada página.