我已经使用python和selenium创建了一个脚本,以便在下面的链接中获取所有可用的文本。网页已经激活了lazyloading方法,这就是为什么每次滚动时都会看到更多的内容。我的脚本也能处理这个问题。在
然而,问题是,当我的脚本使网页耗尽其内容到达底部时,它就卡住了。一旦它可以脱离循环,我就可以获取内容。我怎样才能打破这个循环?在
我知道.LoadingDots
总是在那里。这就是我找不到任何逻辑来打破这个循环的唯一原因。在
以下是我迄今为止尝试的方法:(无法摆脱循环)
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
wait = WebDriverWait(driver,10)
driver.get("https://www.quora.com/topic/American-Football")
while True:
try:
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
wait.until(EC.invisibility_of_element_located((By.CSS_SELECTOR, ".LoadingDots")))
except Exception: break
for item in wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".ui_qtext_rendered_qtext .ui_qtext_para"))):
print(item.text)
driver.quit()
我知道,如果我遵守以下要求,我可以解决问题:
^{pr2}$我的问题是:如何使用我的第一个脚本使用.LoadingDots
的方式,从该页面获取耗尽所有滚动条的内容?
您的脚本没有按预期工作,因为
(By.CSS_SELECTOR, ".LoadingDots")
选择器返回这个元素<div class="LoadingDots tiny">
,而且它总是隐藏的,所以您对其不可见性的期望总是返回True
,并且循环无法中断。在您需要使用
"LoadingDots"
类名:<div class="LoadingDots regular">
检查另一个元素,逻辑应该如下:如果翻页后我们看不到点-打破循环
但是!请注意,我发布这个脚本只是为了指出为什么你的脚本不能工作。。。如果内容加载太快(可能性很低,但是…)脚本可能无法捕捉到加载点出现的时刻,您将无法获得所需的所有内容。在
所以@Guy解决方案似乎更可靠(+1)
当页面滚动到按钮时,类为
.LoadingDots.regular
的元素保持不变,但其父元素添加了新的类hidden
。您可以检查是否使用get_attribute
函数添加了该类。您也可以直接用类spinner_display_area
找到它相关问题 更多 >
编程相关推荐