【问题标题】:Python-Selenium scroll until certain textPython-Selenium 滚动直到某些文本
【发布时间】:2016-11-01 22:38:33
【问题描述】:

我试图让 selenium 滚动 facebook 页面,直到某些文本然后从该页面获取 HTML 标签。我正在尝试在 facebook 上发布日期文本并让 Seleinum 滚动到该页面。此代码不会向我抛出错误,但也不会执行任务。我怎样才能做到这一点?现在它一直在滚动并且不会停止。 我只是想滚动页面,直到看到文本“Oct 5th”。

driver.get("https://www.facebook.com/search/latest/?q=%23blacklivesmatter")
sleep(4)
wait = WebDriverWait(driver, 10)

while True:
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    try:
        wait.until(EC.visibility_of_element_located((By.XPATH, "//*[contains(text(), 'Oct 5th')]")))
        html = driver.page_source
        soup = BeautifulSoup(html)
    except TimeoutException:
        break

【问题讨论】:

    标签: python selenium


    【解决方案1】:

    编辑:我们需要寻找元素的存在而不是可见性。

    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium import webdriver
    from selenium.common.exceptions import TimeoutException
    from time import sleep
    
    driver = webdriver.Chrome()
    driver.get("https://www.facebook.com/search/latest/?q=%23blacklivesmatter")
    wait = WebDriverWait(driver, 10)
    
    find_elem = None
    scroll_from = 0
    scroll_limit = 3000
    while not find_elem:
        sleep(2)
        driver.execute_script("window.scrollTo(%d, %d);" %(scroll_from, scroll_from+scroll_limit))
        scroll_from += scroll_limit
        try:
            find_elem = wait.until(EC.presence_of_element_located((By.XPATH, "//*[contains(text(), 'Oct 5th')]")))
        except TimeoutException:
            pass
    driver.close()
    

    【讨论】:

    • 这对我不起作用。我只是以 50 分钟为例,而不是 10 月 5 日。它没有向下滚动到我想要的位置。它只是停止。我非常想向下滚动到某些 Facebook 发布时间。
    • @Dilli 如果您删除了 tryexcept 块怎么办?
    • 我稍微编辑了我的答案。它甚至滚动一次吗?
    • 那也行不通。完全按照之前所做的:/
    • 它确实向下滚动到一定数量然后脚本停止。
    【解决方案2】:

    首先,如果你要找的这段文字在页面的某处,即使不是立即可见,在HTML中也应该直接可见,不需要滚动.仅当需要刷新页面以加载以前不可用的其他内容时才需要滚动。

    现在,我建议在您的方法中更改以下内容:

    1. 首先,如果页面确实需要加载一些在滚动之前不可用的数据,您应该给它足够的时间来这样做。如果您滚动和查找文本的速度过快,则没有足够的时间来获取更新的 HTML,并且您基本上每次都会查询相同的 DOM。现在,鉴于您不一定知道您的文本何时出现,您每次都必须等待一个固定的硬编码时间段。几秒钟就足够了,至少最初只是为了证明它有效。

    2. 只是为了排除使用wait.until 可能出现的问题,请尝试直接在 HTML 源代码中查找此文本。当您确保脚本的其余部分正常工作时,您可以稍后更改它并使用wait.until

    【讨论】:

    • 我们确实需要滚动,因为我正在尝试获取更多帖子。例如,我正在寻找文本“50 分钟”,该文本仅在页面加载后通过向下滚动显示。
    • @Dilli 好的,然后按照我的回答中的建议进行操作
    猜你喜欢
    • 1970-01-01
    • 2021-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-10
    • 2016-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多