我有一个网页,它可以动态加载内容,而页面加载时却有纺车,我已经找到了解决方案来抓取立即在页面上加载的内容,但似乎找不到解决方案来抓取稍后在dom中加载的内容。
我能想到的是找到具有特定类型旋转轮毂的元素,并等待其更改(一旦更改),这意味着内容已加载到dom中。
我在Selenium
上将Firefox
与webdriver
Ubuntu
一起使用。
这是我要监视的类(class):
<div class="wheel spinning"></div>
加载内容后,车轮停止旋转并将类更改为:
<div class="wheel"></div>
任何人都可以找到解决方案来查找和监视
class="wheel spinning"
,一旦将其更改为class="wheel"
即可继续获取数据。编辑:
XPATH实际上解决了解决方案的一部分,这是代码的一部分
try:
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.XPATH, "//*[@class='wheel']))
)
title = driver.find_element_by_xpath('/html/body/div[1]/div[1]/div[3]')
print(title.text)
但是,如果元素在10秒钟内未出现,则错误消失了,现在可以找到一种方法,可以一次又一次地重试,直到页面上出现该元素为止。
presence_of_element_located((By.XPATH))
和find_element_by_xpath
的使用是否有区别
最佳答案
@LucasTierney的答案是正确的方向。但是我仍然觉得该解决方案可以按以下方式进行优化:
由于轮是可见的,因此您需要使用 presence_of_element_located()
方法来代替visibility_of_element_located()
方法。
节点:
<div class="wheel spinning"></div>
不能通过包含单个类的XPath进行定位,即仅
wheel
,如下所示:el = WebDriverWait(driver, 30).until(EC.presence_of_element_located((By.XPATH, "//*[@class='wheel']")))
相反,您可以使用Locator Strategies之一:
cssSelector
:el = WebDriverWait(driver, 30).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div.wheel.spinning")))
WebDriverWait(driver, 10).until(lambda d: 'spinning' not in el.get_attribute('class'))
xpath
:el = WebDriverWait(driver, 30).until(EC.visibility_of_element_located((By.XPATH, "//div[@class='wheel spinning']")))
WebDriverWait(driver, 10).until(lambda d: 'spinning' not in el.get_attribute('class'))
关于Python,Selenium用类查找元素并等待类更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53240157/