¿Cómo analizar los resultados de búsqueda del sitio web después de haber usado send_keys (Python) en la barra de búsqueda?

Jan 05 2021

Mi pregunta está relacionada con esta publicación: ingrese la consulta en la barra de búsqueda y raspe los resultados

Puedo ejecutar la respuesta dada a esta pregunta anterior, pero no puedo extraer datos del sitio web al que navega Chrome mediante el bucle book. Solo encontré respuestas que mostrarían cómo extraer datos de dmi código, pero no del resultado de la búsqueda después de haber usado send_keys.

Intenté acceder al elemento pero no puedo hacerlo y me gustaría extraer los datos del sitio web resultante después de buscar booky luego pasar a la siguiente ronda del ciclo.

Lo intenté:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
d = webdriver.Chrome('mypath/chromedriver.exe')
books = ['9780062457738']
for book in books:
  d.get('https://www.bol.com/nl/')
  e = d.find_element_by_id('searchfor')
  f = print(e.send_keys(book, Keys.ENTER))

También probé sin la print()función pero no devuelve ningún elemento real si escribo f?obtengo:

Type:        NoneType
String form: None
Docstring:   <no docstring>

¡Cualquier ayuda sobre cómo analizar los datos de, por ejemplo, el autor del libro, el título u otra información después de haber enviado una consulta de búsqueda es muy bienvenida!

Respuestas

DebanjanB Jan 05 2021 at 22:26

Para extraer y título del libro es decir, el arte sutil de no dar un F * ck usted necesita para inducir WebDriverWait para el visibility_of_element_located()y se puede utilizar cualquiera de las siguientes estrategias de localización :

  • Utilizando CSS_SELECTOR:

    driver.get("https://www.bol.com/nl/")
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button.js-confirm-button>span"))).click()
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input#searchfor"))).send_keys("9780062457738")
    driver.find_element_by_css_selector("button[type='submit']").click()
    print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "a.product-title"))).get_attribute("innerHTML"))
    
  • Utilizando XPATH:

    driver.get("https://www.bol.com/nl/")
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//span[text()='Accepteren']"))).click()
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@id='searchfor']"))).send_keys("9780062457738")
    driver.find_element_by_xpath("//button[@type='submit']").click()
    print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//a[contains(@class, 'product-title')]"))).get_attribute("innerHTML"))
    
  • Salida de consola:

    The Subtle Art of Not Giving a F*ck
    
  • Nota : Debe agregar las siguientes importaciones:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC