Como analisar os resultados da pesquisa do site depois de usar send_keys (Python) na barra de pesquisa?
Minha pergunta está relacionada a este post: Digite a consulta na barra de pesquisa e raspe os resultados
Consigo executar a resposta dada a essa pergunta anterior, mas não consigo extrair dados do site para o qual o Chrome navega por meio do looping book
. Eu só encontrei respostas que mostrariam como extrair dados do d
meu código, mas não do resultado da pesquisa após ter usado send_keys
.
Tentei acessar o elemento, mas não consigo fazer isso e gostaria de extrair os dados do site resultante depois de pesquisar book
e ir para a próxima rodada do loop.
Tentei:
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))
Eu também tentei sem a print()
função, mas ela não retorna nenhum elemento real se eu digitar f?
e obtiver:
Type: NoneType
String form: None
Docstring: <no docstring>
Qualquer ajuda sobre como analisar os dados, por exemplo, do autor do livro, título ou outra informação após ter enviado uma consulta de pesquisa é muito bem-vinda!
Respostas
Para extrair o título do livro, ou seja, A arte sutil de não dar a mínima, você precisa induzir WebDriverWait para o visibility_of_element_located()
e pode usar uma das seguintes estratégias de localizador :
Usando
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"))
Usando
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"))
Saída do console:
The Subtle Art of Not Giving a F*ck
Nota : Você deve adicionar as seguintes importações:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC