硒无法通过类名称找到元素

时间:2020-09-26 09:11:30

标签: python-3.x selenium selenium-webdriver

我正在尝试从this亚马逊页面获取元素,这是该产品的平均评论率。它位于这里:

enter image description here

在检查控制台中,该部分显示如下:

<span data-hook="rating-out-of-text" class="a-size-medium a-color-base">4.4 out of 5</span>

我的代码是:

chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
chrome_options.add_argument('--incognito')
driver = webdriver.Chrome(chromepath, chrome_options=chrome_options)
driver.maximize_window()
driver.get('https://www.amazon.com/dp/B07B2STSLV')

driver.find_element_by_class_name("a-size-medium a-color-base")

所需的输出是:

4.4 out of 5

但它返回en错误:

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":".a-size-medium a-color-base"}
  (Session info: headless chrome=85.0.4183.121)

因此,显然这种方法无效。我还尝试了使用CSS选择器的几种方法:

 driver.find_elements_by_css_selector("span.a-size-base a-nowrap")

并通过xpath获取元素:

driver.find_element_by_xpath('//*[@id="reviewsMedley"]')

但是两者都不起作用

是否有任何想法?

3 个答案:

答案 0 :(得分:3)

您在find_element_by_class_name中使用了2个类,即a-size-mediuma-color-base的class_name选择器不支持复合类。那就是为什么它不起作用

driver.find_elements_by_css_selector("span.a-size-base a-nowrap")也不起作用,因为两个类a-size-basea-nowrap属于同一标签,即<span>

简而言之,您必须使用代表类的点.组合同一标签中的所有类。

css路径看起来像-

driver.find_element_by_css_selector("span.a-size-base.a-nowrap").text

您可以按如下所示在xpath中使用复合类

 driver.find_element_by_xpath("//span[@class='a-size-base a-nowrap']").text

您遇到的情况是需要元素,因此请使用find_element而不是find_elements

答案 1 :(得分:3)

您也可以尝试以下方法:

driver.find_element_by_xpath(“//span[@class=‘a-size-medium a-color-base’]”)

答案 2 :(得分:1)

这是操作方法。首先,我们单击标签以将其打开,抓取,然后打印出元素。使用等待页面加载,然后将其打印为.text。

WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#acrPopover > span.a-declarative > a"))).click()
elem=WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, "div.a-icon-row.a-spacing-small.a-padding-none > span")))
print(elem.text)

输出

4.4 out of 5

导入

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