gpt4 book ai didi

python - 如何使用 EC.presence_of_element_ located((By.ID, "myDynamicElement")) 除了指定类而不是 ID

转载 作者:太空宇宙 更新时间:2023-11-03 20:34:26 32 4
gpt4 key购买 nike

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

我最初是这样做的:

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")))

将引发错误:

Message: invalid selector: Compound class names not permitted

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

You can find a detailed discussion in Invalid selector: Compound class names not permitted using find_element_by_class_name with Webdriver and Python

<小时/>

解决方案

您需要注意以下几件事:

  • 在您的用例没有任何可见性的情况下,功能性地诱导与 EC 关联的 WebDriverWait 作为 presence_of_element_ located() 仅确认元素是否存在于DOM Tree 。想必继续前进要么您需要获取属性,例如valueinnerText 等,否则您将与该元素进行交互。因此,您需要使用 visibility_of_element_ located()element_to_be_clickable()
  • ,而不是 presence_of_element_ located()

You can find a detailed discussion in WebDriverWait not working as expected

  • 为了获得最佳结果,您可以组合 IDCLASS 属性,并且可以使用以下任一 Locator Strategies :

  • 使用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']")))

关于python - 如何使用 EC.presence_of_element_ located((By.ID, "myDynamicElement")) 除了指定类而不是 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57262217/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com