【问题标题】:How to parse search results from website after having used send_keys (Python) in search bar?在搜索栏中使用 send_keys (Python) 后如何解析网站的搜索结果?
【发布时间】:2021-04-11 08:03:06
【问题描述】:

我的问题与这篇文章有关:Enter query in search bar and scrape results

我能够执行前一个问题的答案,但无法通过循环 book 从 Chrome 导航到的网站上抓取数据。我只找到了显示如何在我的代码中从d 中抓取数据的答案,但在使用send_keys 之后却没有从搜索结果中找到。

我尝试访问该元素但无法访问,我想在搜索 book 后从生成的网站中抓取数据,然后进入下一轮循环。

我试过了:

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

我也尝试不使用print() 函数,但如果我输入f?,它不会返回任何真实元素我得到:

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

非常欢迎在提交搜索查询后就如何解析书籍作者、书名或其他信息等数据提供任何帮助!

【问题讨论】:

  • 您等待结果了吗?加载查询可能需要一段时间,在填充之前读取这些元素会产生空结果。
  • 我不这么认为@nagyl。我尝试了time.sleep(2),但仍然没有得到正确的结果。

标签: python selenium xpath css-selectors webdriverwait


【解决方案1】:

要提取和书名,即The Subtle Art of Not Give a F*ck,您需要为visibility_of_element_located() 诱导WebDriverWait,您可以使用以下Locator Strategies 之一:

  • 使用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"))
    
  • 使用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"))
    
  • 控制台输出:

    The Subtle Art of Not Giving a F*ck
    
  • 注意:您必须添加以下导入:

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

【讨论】:

  • 非常感谢!这非常有用@DebanjanB 并解决了我的问题:)
猜你喜欢
  • 2013-02-09
  • 2014-10-25
  • 1970-01-01
  • 1970-01-01
  • 2022-07-06
  • 2018-06-04
  • 1970-01-01
  • 1970-01-01
  • 2011-04-22
相关资源
最近更新 更多