Comment analyser les résultats de recherche du site Web après avoir utilisé send_keys (Python) dans la barre de recherche?

Jan 05 2021

Ma question est liée à ce message: saisissez la requête dans la barre de recherche et récupérez les résultats

Je suis en mesure d'exécuter la réponse donnée à cette ancienne question, mais je ne parviens pas à extraire les données du site Web sur lequel Chrome navigue en effectuant une boucle book. Je n'ai trouvé que des réponses qui montreraient comment extraire des données de dmon code, mais pas du résultat de la recherche après avoir utilisé send_keys.

J'ai essayé d'accéder à l'élément mais je ne peux pas le faire et j'aimerais récupérer les données du site Web résultant après avoir recherché booket ensuite passé au tour suivant de la boucle.

J'ai essayé:

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))

J'ai aussi essayé sans la print()fonction mais cela ne renvoie aucun élément réel si je tape f?I get:

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

Toute aide sur la façon d'analyser les données de par exemple l'auteur du livre, le titre ou d'autres informations après avoir soumis une requête de recherche est la bienvenue!

Réponses

DebanjanB Jan 05 2021 at 22:26

Pour extraire le titre du livre, c'est-à-dire The Subtle Art of Not Giving a F * ck, vous devez induire WebDriverWait pour le visibility_of_element_located()et vous pouvez utiliser l'une des stratégies de localisation suivantes :

  • Utilisation 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"))
    
  • Utilisation 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"))
    
  • Sortie de la console:

    The Subtle Art of Not Giving a F*ck
    
  • Remarque : vous devez ajouter les importations suivantes:

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