Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Selenium滚动到特定文本_Python_Selenium - Fatal编程技术网

Python Selenium滚动到特定文本

Python Selenium滚动到特定文本,python,selenium,Python,Selenium,我试图让selenium滚动facebook页面,直到特定文本出现,然后从该页面获取HTML标记。我试图在facebook上发布日期文本,并让Seleinum滚动到该页面。这段代码不会抛出错误,但也不会执行任务。我怎样才能做到这一点?现在它一直在滚动,而且没有停止。 我只是想滚动页面,直到“10月5日”文本可见 driver.get("https://www.facebook.com/search/latest/?q=%23blacklivesmatter") sleep(4) wait = W

我试图让selenium滚动facebook页面,直到特定文本出现,然后从该页面获取HTML标记。我试图在facebook上发布日期文本,并让Seleinum滚动到该页面。这段代码不会抛出错误,但也不会执行任务。我怎样才能做到这一点?现在它一直在滚动,而且没有停止。 我只是想滚动页面,直到“10月5日”文本可见

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

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

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()

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

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()

首先,如果您要查找的文本位于页面上的某个地方,即使它不是立即可见的,也应该直接在HTML中可见,而不需要滚动。只有当页面需要刷新以加载以前不可用的其他内容时,才需要滚动

现在,我建议改变你的方法:

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

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


  • 首先,如果您要查找的文本位于页面上的某个地方,即使它不是立即可见的,也应该直接在HTML中可见,而不需要滚动。只有当页面需要刷新以加载以前不可用的其他内容时,才需要滚动

    现在,我建议改变你的方法:

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

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


  • 那对我不起作用。我用50分钟作为例子,而不是10月5日。它没有向下滚动到我想要的地方。它只是停止了。我几乎是在试图向下滚动到某个facebook发布时间。@Dilli如果你删除了
    try
    除了
    块怎么办?我编辑了一下我的答案。它会滚动一次吗?那也不行。与之前完全相同:/it向下滚动到一定数量,然后脚本停止。这对我不起作用。我用50分钟作为例子,而不是10月5日。它没有向下滚动到我想要的地方。它只是停止了。我几乎是在试图向下滚动到某个facebook发布时间。@Dilli如果你删除了
    try
    除了
    块怎么办?我编辑了一下我的答案。它会滚动一次吗?那也不行。与之前完全一样:/它确实向下滚动到一定数量,然后脚本停止。我们确实需要滚动,因为我正在尝试获取其他帖子。例如,我正在查找文本“50分钟”,该文本只有在页面向下滚动加载后才会显示。@Dilli确定,然后按照我回答中的建议进行操作。我们确实需要滚动,因为我正在尝试获取其他帖子。例如,我正在查找文本“50分钟”,该文本仅在页面向下滚动加载后显示。@Dilli确定,然后按照我答案中的建议进行操作