Selenium为什么在Wikipedia上找不到此类?

时间:2019-08-03 17:30:45

标签: python selenium web-scraping

我正试图从维基百科中抽出一张桌子。当我尝试使用以下driver.find_element_by_class_name(name)拉动它时,它将不起作用。但是,当转到html源代码时,我可以显式查看要查找的类名。

我确实意识到还有其他方法可以提取此表,并且我已经转向了更简单的方法。我很好奇为什么Selenium在HTML中找不到该类。

from selenium import webdriver

driver = webdriver.Chrome(r"\chromedriver_win32\chromedriver.exe")
driver.get(r'https://en.wikipedia.org/wiki/List_of_airports_in_the_United_States')
driver.implicitly_wait(2)

driver.find_element_by_class_name(name='wikitable sortable jquery-tablesorter')

但是,我得到的错误是

NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":".wikitable sortable jquery-tablesorter"}
  (Session info: chrome=75.0.3770.142)

3 个答案:

答案 0 :(得分:2)

要处理动态元素,请使用WebdriverWaitvisibility_of_element_located并跟随css选择器。

WebDriverWait(driver,20).until(EC.visibility_of_element_located((By.CSS_SELECTOR,".wikitable.sortable.jquery-tablesorter")))

您需要导入以下内容。

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
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome(r"\chromedriver_win32\chromedriver.exe")
driver.get(r'https://en.wikipedia.org/wiki/List_of_airports_in_the_United_States')
print(WebDriverWait(driver,20).until(EC.visibility_of_element_located((By.CSS_SELECTOR,".wikitable.sortable.jquery-tablesorter"))).text)

答案 1 :(得分:1)

wikitable sortable jquery-tablesorter是3个类名:Wikitable,sortable和jquery-tablesorter。 .find_element_by_class_name()仅采用由单个类名组成的单个参数,例如.find_element_by_class_name("wikitable")。根据该类名是否唯一地找到所需的元素,可能会找到所需的元素。

另一种选择是使用CSS选择器,以便您可以在单个定位器中使用所有三个类,例如

.wikitable.sortable.jquery-tablesorter

其中.表示CSS选择器语法中的类名称。有关CSS选择器及其语法的更多信息,请参见下面的CSS选择器参考。

W3C Selectors Overview

Selenium Tips: CSS Selectors

Taming Advanced CSS Selectors

答案 2 :(得分:-1)

请直接在函数find_element_by_class_name()中使用类名。因此,与其像这样写:

driver.find_element_by_class_name(name='wikitable sortable jquery-tablesorter')

请这样写:

driver.find_element_by_class_name('wikitable sortable jquery-tablesorter')

希望它会有所帮助:)