如何修复“ selenium.common.exceptions.NoSuchElementException”

时间:2019-09-28 17:30:09

标签: python selenium xpath css-selectors nosuchelementexception

我正在尝试在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 :(得分:0)

在这种情况下,问题在于Xpath将返回空元素,因此我建议您首先在chrome控制台中尝试Xpath或cssSelector,您可以使用:

$x('XpathHere')

检查Xpath将返回什么或

$$('ccsSelectorHere')

检查css选择器将返回什么。

答案 1 :(得分:0)

要获取文本,首先必须等待直到元素可见。为此,您可以使用WebDriverWaitvisibility_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

答案 2 :(得分:0)

您看到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上卖家的评论数量,您必须为visibility_of_element_located()引入 WebDriverWait ,并且您可以使用跟随Locator Strategies

  • 使用CSS_SELECTORtext属性:

    print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "a.tst_reviews_filter_all>span"))).text)
    
  • 使用XPATHget_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_SELECTORtext属性:

    print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "a.tst_reviews_filter_all>span"))).text.replace('(', '').replace(')', ''))
    
  • 使用XPATHget_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” when using Chrome的详细讨论

答案 3 :(得分:-1)

您的xpath错误或者该xpath可能无法显示某些元素。


您可以使用尝试捕获块来防止程序停止。

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)

答案 4 :(得分:-1)

要获取评论数,请诱导WebDriverWaitelement_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