我正在尝试在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)
答案 0 :(得分:0)
在这种情况下,问题在于Xpath将返回空元素,因此我建议您首先在chrome控制台中尝试Xpath或cssSelector,您可以使用:
$x('XpathHere')
检查Xpath将返回什么或
$$('ccsSelectorHere')
检查css选择器将返回什么。
答案 1 :(得分:0)
要获取文本,首先必须等待直到元素可见。为此,您可以使用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
答案 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_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” 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)
要获取评论数,请诱导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