Aquí está mi código:
from selenium import webdriver from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.common.by import By import pandas as pd driver = webdriver.Chrome(service=Service(executable_path=ChromeDriverManager().install())) driver.maximize_window() driver.get('https://quotes.toscrape.com/') df = pd.DataFrame( { 'Quote': [''], 'Author': [''], 'Tags': [''], } ) quotes = driver.find_elements(By.CSS_SELECTOR, '.quote') for quote in quotes: text = quote.find_element(By.CSS_SELECTOR, '.text') author = quote.find_element(By.CSS_SELECTOR, '.author') tags = quote.find_elements(By.CSS_SELECTOR, '.tag') for tag in tags: quote_tag = tag df = df.append( { 'Quote': text.text, 'Author': author.text, 'Tags': quote_tag.text, }, ignore_index = True ) df.to_csv('C:/Users/Jay/Downloads/Python/!Learn/practice/scraping/selenium/quotes.csv', index=False)Debería estar obteniendo este resultado:
| Cita | Autor | Etiquetas |
|---|---|---|
| “El mundo tal como lo hemos creado es un proceso de nuestro pensamiento. No se puede cambiar sin cambiar nuestro pensamiento”. | Albert Einstein | cambiar pensamientos profundos mundo de pensamiento |
En su lugar estoy recibiendo esto:
| Cita | Autor | Etiquetas |
|---|---|---|
| “El mundo tal como lo hemos creado es un proceso de nuestro pensamiento. No se puede cambiar sin cambiar nuestro pensamiento”. | Albert Einstein | mundo |
Obtengo solo el último elemento de la columna Tags en lugar de los cuatro elementos.
Si ejecuto:
quotes = driver.find_elements(By.CSS_SELECTOR, '.quote') for quote in quotes: tags = quote.find_elements(By.CSS_SELECTOR, '.tag') for tag in tags: quote_tag = tag print(quote_tag.text)Yo obtengo:
change deep-thoughts thinking world etcAsí que ese trozo de código funciona.
¿Por qué la columna Tags no se completa correctamente?
con tu codigo
for tag in tags: quote_tag = tag reemplaza quote_tag con tag en cada ejecución del ciclo for y, por lo tanto, anula el valor anterior almacenado en quote_tag . Por lo tanto, después de la última ejecución, quote_tag solo contiene la última etiqueta.
Tienes que hacer algo como
quote_tag = '' for tag in tags: quote_tag += ' ' + tagsi desea concatenar todas las etiquetas juntas.
Para su ciclo, use este código:
quote_tags = [] for tag in tags: quote_tags.append(tag.text) df = df.append( { 'Quote': text.text, 'Author': author.text, 'Tags': ' '.join(quote_tags), }, ignore_index = True ) Si nota, la única etiqueta que se agrega ( world ) resulta ser la última etiqueta... y eso no es una coincidencia. Es porque recorres las etiquetas y, para cada etiqueta, asignas esa etiqueta a la variable quote_tag , pero no haces nada con ella, por lo que la siguiente iteración del bucle simplemente sobrescribe el valor establecido por la iteración anterior. Finalmente, cuando termina el bucle, quote_tag tiene el valor de la última etiqueta.