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.

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)
Tags:  , ,

Answer

  1. Avatar for 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:

    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)
    
    dropdown = driver.find_element(By.XPATH,'//*[@id="dropdown-basic"]')
    dropdown.click()
    
    time.sleep(5)
    
    dropdown_options = driver.find_elements(By.CSS_SELECTOR, 'button.dropdown-item')
    
    d=[]
    
    for option in dropdown_options:
        option.click()
        time.sleep(2)
    
        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)
    
    print(data)
    

    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 lista d, 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.

Comments are closed.