Python Can';不要从网页上获取文本

Python Can';不要从网页上获取文本,python,python-3.x,selenium,selenium-webdriver,web-scraping,Python,Python 3.x,Selenium,Selenium Webdriver,Web Scraping,我已经使用python和selenium创建了一个脚本,以获取下面链接中的所有可用文本。该网页已激活lazyloading方法,这就是为什么每次滚动都会看到更多内容的原因。我的脚本也能处理这个问题 然而,问题是,当我的脚本使网页到达底部,耗尽其内容时,它就在那里卡住了。一旦它能够跳出循环,我就可以获取内容。我怎样才能打破这个循环 我知道。加载点总是在那里。这就是我找不到任何逻辑来打破循环的唯一原因 from selenium import webdriver from selenium.web

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

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

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

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()
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
from selenium.common.exceptions import TimeoutException

driver = webdriver.Chrome()
wait = WebDriverWait(driver,10)
driver.get("https://www.quora.com/topic/American-Football")

last_len = len(wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".ui_qtext_rendered_qtext .ui_qtext_para"))))

while True:
    for load_more in wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "a[id$='_more']"))):
        driver.execute_script("arguments[0].click();",load_more)

    try:
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        wait.until(lambda driver: len(wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".ui_qtext_rendered_qtext .ui_qtext_para")))) > last_len)
        items = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".ui_qtext_rendered_qtext .ui_qtext_para")))
        last_len = len(items)
    except TimeoutException: break

for item in items:
    print(item.text)

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

我知道如果我遵守以下要求,我可以解决问题:


我的问题是:如何从该页面获取内容,使用我在第一个脚本中尝试的方法,使用
.LoadingDots

将页面滚动到按钮时,具有类
.LoadingDots.regular
的元素保持不变,但是它的父元素添加了新类
hidden
。您可以使用
get\u attribute
函数检查是否添加了该类。您也可以使用类
微调器\u显示\u区域直接定位它

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;

您的脚本无法按预期工作,因为
(By.CSS_SELECTOR,“.LoadingDots”)
选择器返回此元素
,并且它总是隐藏的,因此您对其不可见性的预期总是返回
True
,循环无法中断

您需要使用
“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, 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)

    你可以观察屏幕高度,当屏幕停止上升时,屏幕会破裂。你将滚动29.6K个问题:DI肯定不会@ewlink。那个网站的数据对我来说毫无用处。我只想知道我尝试过的方法和失败的方法。@asmitu修复了错误,谢谢。最简单的方法是询问开发人员定位器是什么:)。如果您已经对
    .LoadingDots
    有了新的了解,我会在控制台上使用
    $(“.LoadingDots”)
    来获取所有匹配元素的列表,并在列表中查找正确的元素,在本例中,可见元素在页面重新加载之前出现在帖子下一秒或两秒(可能并不总是有效)您可以删除帖子(使用
    class=“paged\u list\u wrapper”
    ),这将阻止刷新,点将可见。很抱歉@Guy出现任何混乱。我想问的是,当我不知道位置时,如何通过检查(使用开发工具)捕捉到它监视滚动?谢谢。@asmitu没有非常简单的方法。您需要停止加载。一种方法是从html中删除加载元素(参见我的第二条评论)。另一种方法是在加载的元素上放置断点。如果突出显示html左侧的行,您将看到3个点。单击它并选择
    break on>subtree modification
    。此时页面将在重新加载之前停止,您可以在最后一项上使用
    右键单击>滚动到视图
    ,并查看html tree在它下面。在html中的一个元素上与cruiser站在一起将在页面上突出显示它。@asmitu这正是我所说的。