Как я могу исправить "selenium.common.exceptions.NoSuchElementException" - PullRequest
0 голосов
/ 28 сентября 2019

Я пытаюсь найти, сколько отзывов у продавца на bol.com, но там написано selenium.common.exceptions.NoSuchElementException.Вот мой сценарий:

from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.bol.com/nl/v/daanxl/1409231/#ratings")
reviews = driver.find_element_by_xpath("/html/body/div[1]/div[2]/div/div[1]/div/div[2]/ul/li[1]/a/span").text
reviews = reviews.replace("\)", "")
reviews.replace("\(", "")
print(reviews)

Ответы [ 5 ]

0 голосов
/ 29 сентября 2019

Вы видите selenium.common.exceptions.NoSuchElementException в качестве используемого вами локатора:

find_element_by_xpath("/html/body/div[1]/div[2]/div/div[1]/div/div[2]/ul/li[1]/a/span")
  • Не идентифицирует элемент, содержащий количество отзывов, т.е. 63.
  • В соответствии с лучшими практиками при извлечении любого атрибута элемента вам нужно дождаться видимости элемента

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

  • Использование атрибутов CSS_SELECTOR и text:

    print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "a.tst_reviews_filter_all>span"))).text)
    
  • Использование XPATH и get_attribute():

    print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//a[contains(@class,'tst_reviews_filter_all')]/span"))).get_attribute("innerHTML"))
    
  • Вывод на консоль:

    (63)
    

Если вы хотите удалить символ ( с начала и символ ) с конца, вы можете связатьметод replace() следующим образом:

  • Использование атрибутов CSS_SELECTOR и text:

    print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "a.tst_reviews_filter_all>span"))).text.replace('(', '').replace(')', ''))
    
  • Использование XPATHи get_attribute():

    print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//a[contains(@class,'tst_reviews_filter_all')]/span"))).get_attribute("innerHTML").replace("(", "").replace(")", ""))
    
  • Вывод на консоль:

    63
    
  • Примечание : необходимо добавить следующие операции импорта:

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

Здесь вы можете найти подробное обсуждение Selenium «selenium.common.exceptions.NoSuchElementException» при использовании Chrome

0 голосов
/ 28 сентября 2019

Чтобы получить текст, сначала нужно подождать, пока элемент будет виден.Для этого вы можете использовать WebDriverWait и visibility_of_element_located.
Узнайте, как использовать селекторы, посмотрите мой пример ниже.
Вы можете использовать регулярные выражения для поиска чисел в строке.В приведенном ниже коде, если не найдено ни одного числа, используйте 0.

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

driver = webdriver.Chrome()
wait = WebDriverWait(driver, 20)

driver.get("https://www.bol.com/nl/v/daanxl/1409231/#ratings")
reviews = wait.until(ec.visibility_of_element_located((By.CSS_SELECTOR, ".nav-tab__item a span"))).text
reviews_count = re.search("\\d+", reviews) if re.search("\\d+", reviews).group() else 0
0 голосов
/ 28 сентября 2019

Либо ваш xpath неверен, либо некоторые из этого элемента могут не отображаться этим xpath.


Вы можете использовать try catch catch , чтобы предотвратить остановку программы.

from selenium.common.exceptions import NoSuchElementException
from selenium import webdriver

driver = webdriver.Chrome()
driver.get("https://www.bol.com/nl/v/daanxl/1409231/#ratings")
try:
    reviews = driver.find_element_by_xpath("/html/body/div[1]/div[2]/div/div[1]/div/div[2]/ul/li[1]/a/span").text
catch NoSuchElementException:
    print("Element not found")
reviews = reviews.replace("\)", "")
reviews.replace("\(", "")
print(reviews)

0 голосов
/ 28 сентября 2019

Чтобы получить номер отзыва Induce WebDriverWait и element_to_be_clickable () и следующий xpath.

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

driver = webdriver.Chrome()
driver.get("https://www.bol.com/nl/v/daanxl/1409231/#ratings")
print(WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.XPATH,"//a[@class='nav-tab__link tst_reviews_filter_all js_all_link'][contains(.,'Alles')]/span"))).text.replace('(','').replace(')',''))

Вывод на консоль:

63
0 голосов
/ 28 сентября 2019

В этом случае проблема в том, что Xpath вернет пустой элемент, поэтому я предлагаю вам сначала попробовать Xpath или cssSelector в консоли Chrome, вы можете использовать:

$x('XpathHere')

для проверки, что такое Xpathвернется или

$$('ccsSelectorHere')

для проверки того, что вернет селектор css.

...