除了指定类而不是ID之外,如何使用EC.presence_of_element_located((By.ID,“ myDynamicElement”))


问题内容

我正在尝试使用Python网页抓取一个网站,该网站通过使用嵌入式javascript文件将数据作为响应呈现到HTML中来动态加载它的HTML。因此,如果我单独使用BeautifulSoup,我将无法检索所需的数据,因为程序会在Javascript加载数据之前将其抓取。因此,我正在将硒库集成到我的代码中,以使我的程序等到找到某个元素后再抓取网站。

我最初是这样做的:

element = WebDriverWait(driver,100).until(EC.presence_of_element_located((By.ID, "tabla_evolucion")))

但是我想通过执行类似的操作来指定一个类:

element = WebDriverWait(driver,100).until(EC.presence_of_element_located((By.class, "ng-binding ng-scope")))

这是我其余的代码:

driver_path = 'C:/webDrivers/chromedriver.exe'
driver = webdriver.Chrome(executable_path=driver_path)
driver.header_overrides = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36'}
url = "myurlthatIamscraping.com" 
response = driver.get(url)
html = driver.page_source
characters = len(html)
element = WebDriverWait(driver,100).until(EC.presence_of_element_located((By.class, "ng-binding ng-scope")))

print(html)
print(characters)
time.sleep(10)
driver.quit()

它对我不起作用,我在任何地方都找不到正确的语法。


问题答案:

相关的HTML可以帮助我们构建更规范的答案。但是从第一行代码开始:

element = WebDriverWait(driver,100).until(EC.presence_of_element_located((By.ID, "tabla_evolucion")))

在第二行代码中几乎是合法的:

element = WebDriverWait(driver,100).until(EC.presence_of_element_located((By.class, "ng-binding ng-scope")))

将引发错误,如下所示:

消息:无效的选择器:不允许使用复合类名

因为您无法通过传递多个类By.class

您可以在无效的选择器中找到详细的讨论:不允许将find_element_by_class_name与Webdriver和Python一起使用的复合类名称


您需要注意以下几点:

  • 没有任何知名度,你的用例,在功能上诱导 WebDriverWait 与关联 EC 作为presence_of_element_located()只不过证实了该元素的中存在DOM树。想必向前迈进要么你需要得到的属性如valueinnerText等,还是会与要素互动。因此,presence_of_element_located()您无需使用visibility_of_element_located()element_to_be_clickable()

您可以在WebDriverWait中找到详细的讨论,无法正常进行

  • 为了获得最佳结果,您可以将IDCLASS 属性组合在一起,并可以使用以下定位策略之一

    • 使用CSS_SELECTOR

          element = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, ".ng-binding.ng-scope#tabla_evolucion")))
      
    • 使用XPATH

          element = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//*[@class='ng-binding ng-scope' and @id='tabla_evolucion']")))