无法从Web获取文本

2024-06-16 11:50:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经使用python和selenium创建了一个脚本,以便在下面的链接中获取所有可用的文本。网页已经激活了lazyloading方法,这就是为什么每次滚动时都会看到更多的内容。我的脚本也能处理这个问题。在

然而,问题是,当我的脚本使网页耗尽其内容到达底部时,它就卡住了。一旦它可以脱离循环,我就可以获取内容。我怎样才能打破这个循环?在

我知道.LoadingDots总是在那里。这就是我找不到任何逻辑来打破这个循环的唯一原因。在

Link to that site

以下是我迄今为止尝试的方法:(无法摆脱循环)

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的方式,从该页面获取耗尽所有滚动条的内容?


Tags: 方法fromimport脚本ui网页内容by
2条回答

您的脚本没有按预期工作,因为(By.CSS_SELECTOR, ".LoadingDots")选择器返回这个元素<div class="LoadingDots tiny">,而且它总是隐藏的,所以您对其不可见性的期望总是返回True,并且循环无法中断。在

您需要使用"LoadingDots"类名:<div class="LoadingDots regular">检查另一个元素,逻辑应该如下:

  1. 向下滚动页面
  2. 等待加载点出现(开始加载更多内容)
  3. 等待加载点消失(加载更多内容完成)

如果翻页后我们看不到点-打破循环

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, 5)
driver.get("https://www.quora.com/topic/American-Football")

while True:
    try:
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, ".LoadingDots.regular")))
        wait.until(EC.invisibility_of_element_located((By.CSS_SELECTOR, ".LoadingDots.regular")))
    except Exception: continue
    else: 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()

但是!请注意,我发布这个脚本只是为了指出为什么你的脚本不能工作。。。如果内容加载太快(可能性很低,但是…)脚本可能无法捕捉到加载点出现的时刻,您将无法获得所需的所有内容。在

所以@Guy解决方案似乎更可靠(+1)

当页面滚动到按钮时,类为.LoadingDots.regular的元素保持不变,但其父元素添加了新的类hidden。您可以检查是否使用get_attribute函数添加了该类。您也可以直接用类spinner_display_area找到它

while True:
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

    loading_dots = driver.find_element_by_class_name('spinner_display_area')
    if 'hidden' in loading_dots.get_attribute('class'):
        break;

相关问题 更多 >