Как извлечь атрибут href из первого результата поиска с помощью Selenium и Python - PullRequest
1 голос
/ 09 июля 2020

У меня есть список книг на моем Excel, для каждой я хочу заполнить столбец сводкой. Для этого я захожу на сайт goodreads.com, ищу "harry potter", открываю первый полученный результат, а затем копирую, вставляя итоговый текст. Однако возникли проблемы с получением ссылки на 1-й результат поиска. вот мой код. Ссылка, на которую я ссылался: Python Selenium - получить значение href

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver=webdriver.Chrome()
driver.get('https://goodreads.com')


loginbox=driver.find_element_by_xpath('//*[@id="userSignInFormEmail"]')
loginbox.send_keys('shivam01anand@gmail.com')
passwordbox=driver.find_element_by_xpath('//*[@id="user_password"]')
passwordbox.send_keys('shivam03')
loginButton=driver.find_element_by_xpath('//*[@id="sign_in"]/div[3]/input[1]')
loginButton.click()

searchbox=driver.find_element_by_xpath('/html/body/div[2]/div/header/div[2]/div/div[2]/form/input[1]')
searchbox.send_keys('harry potter')

searchButton=driver.find_element_by_xpath('/html/body/div[2]/div/header/div[2]/div/div[2]/form/button')
searchButton.click()

elem=driver.find_element_by_css_selector("bookTitle").get_attribute("href")
print(elem)
#elem = driver.find_element_by_css_selector("bookTitle [href]")
Error: NoSuchElementException: no such element: Unable to locate element: {"method":"xpath","selector":"/html/body/div[2]/div/header/div[2]/div/div[2]/form/input[1]"}
  (Session info: chrome=83.0.4103.116)

Эта ошибка возникает только тогда, когда я пишу строку elem, что странно, потому что ошибка связана с предыдущая строка. Совершенно запутались.

1 Ответ

0 голосов
/ 09 июля 2020

Чтобы напечатать значение атрибута href первого результата поиска, вы должны вызвать WebDriverWait для visibility_of_element_located(), и вы можете использовать любой из следующих Locator Стратегии :

  • Использование CSS_SELECTOR:

    driver.get("https://goodreads.com")
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@id='userSignInFormEmail']"))).send_keys("shivam01anand@gmail.com")
    driver.find_element_by_xpath("//input[@id='user_password']").send_keys("shivam03")
    driver.find_element_by_xpath("//input[@value='Sign in']").click()
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.NAME, "q"))).send_keys("harry potter")
    driver.find_element_by_xpath("//button[@aria-label='Search']").click()
    # extracting the _href_ attribute of the first search result using CSS_SELECTOR
    print(WebDriverWait(driver, 5).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "table.tableList > tbody > tr td a.bookTitle"))).get_attribute("href"))
    
  • Использование XPATH:

    driver.get("https://goodreads.com")
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@id='userSignInFormEmail']"))).send_keys("shivam01anand@gmail.com")
    driver.find_element_by_xpath("//input[@id='user_password']").send_keys("shivam03")
    driver.find_element_by_xpath("//input[@value='Sign in']").click()
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.NAME, "q"))).send_keys("harry potter")
    driver.find_element_by_xpath("//button[@aria-label='Search']").click()
    # extracting the _href_ attribute of the first search result using XPATH
    print(WebDriverWait(driver, 5).until(EC.visibility_of_element_located((By.XPATH, "//table[@class='tableList']/tbody/tr//td//a[@class='bookTitle']"))).get_attribute("href"))
    
  • Примечание : необходимо добавить следующие импорты:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
  • Вывод консоли:

    https://www.goodreads.com/book/show/3.Harry_Potter_and_the_Sorcerer_s_Stone?from_search=true&from_srp=true&qid=3nIjRXwsfG&rank=1
    

Ссылки

Вы можете найти пару соответствующих обсуждений на NoSuchElementException в:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...