我试图让selenium滚动脸书页面,直到某些文字然后从该页面获取HTML标签。我试图在Facebook上发布日期文本并让Seleinum滚动到该页面。这段代码并没有给我带来错误,但也没有完成任务。我怎样才能做到这一点?现在它继续滚动并且不会停止。 我只想尝试滚动页面,直到文字“10月5日”和#39;是可见的。
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
答案 0 :(得分:0)
编辑:我们需要查找元素的存在而不是可见性。
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()
答案 1 :(得分:0)
首先,如果您要查找的文本在页面上某处,即使它不能立即显示,它仍然可以直接在HTML中显示,而无需滚动。只有在需要刷新页面以加载以前不可用的其他内容时才需要滚动。
现在,我建议您在方法中更改以下内容:
首先,如果页面确实需要加载滚动前不可用的一些数据,则应该给它足够的时间来执行此操作。如果您滚动并快速查找文本,它将没有足够的时间来获取更新的HTML,您基本上只会每次查询相同的DOM。现在,鉴于您不一定知道文本何时出现,您每次都必须等待一个恒定的硬编码时段。几秒钟应该足够了,至少最初只是证明它有效。
只是为了排除使用wait.until
的可能问题,请尝试直接在HTML源代码中查找此文本。您可以稍后更改它,并在确保脚本的其余部分正常工作时使用wait.until
。