検索バーでsend_keys(Python)を使用した後、Webサイトからの検索結果を解析するにはどうすればよいですか?

Jan 05 2021

私の質問はこの投稿に関連しています:検索バーにクエリを入力して結果をスクレイピングします

この前の質問に対する回答を実行することはできますが、Chromeがループオーバーによって移動するWebサイトからデータを取得することはできませんbookdコード内からデータをスクレイピングする方法を示す回答のみが見つかりましたが、を使用しsend_keysた後の検索結果からは見つかりませんでした。

要素にアクセスしようとしましたが、アクセスできません。検索しbookてループの次のラウンドに進んだ後、結果のWebサイトからデータを取得したいと思います。

私は試した:

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>

検索クエリを送信した、たとえば本の著者、タイトル、またはその他の情報のデータを解析する方法に関するヘルプは大歓迎です。

回答

DebanjanB Jan 05 2021 at 22:26

タイトル、つまりF * ck与えないという微妙な芸術を抽出して予約するには、WebDriverWaitを誘導する必要がvisibility_of_element_located()あり、次のロケーター戦略のいずれかを使用できます。

  • 使用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