我在python中编写了一个脚本来从缓慢加载的网页中删除名称。该页面中有1000个名称,只有在浏览器向下滚动时才能加载完整内容。但是,我的脚本可以成功到达此页面的最低部分并解析所有名称。我在这里遇到的问题是我在这种情况下使用了5秒的硬编码延迟,这使得浏览器不必等待即使加载项目也是如此。那么我如何使用显式等待来克服这种情况并解析所有项目。
这是我到目前为止编写的脚本:
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("http://fortune.com/fortune500/list/")
check_height = driver.execute_script("return document.body.scrollHeight;")
while True:
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(5)
height = driver.execute_script("return document.body.scrollHeight;")
if height == check_height:
break
check_height = height
listElements = driver.find_elements_by_css_selector(".company-title")
for item in listElements:
print(item.text)
答案 0 :(得分:1)
您可以添加明确等待,如下所示:
from selenium.webdriver.support.ui import WebDriverWait
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://fortune.com/fortune500/list/")
check_height = driver.execute_script("return document.body.scrollHeight;")
while True:
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
try:
WebDriverWait(driver, 10).until(lambda driver: driver.execute_script("return document.body.scrollHeight;") > check_height)
check_height = driver.execute_script("return document.body.scrollHeight;")
except:
break
listElements = driver.find_elements_by_css_selector(".company-title")
for item in listElements:
print(item.text)
这应该允许您避免硬编码time.sleep()
- 相反,您只是等待更改height
值或者在滚动后经过10秒后height
不变的情况下中断循环。 ..
答案 1 :(得分:0)
您需要使用显式等待,如下所示:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Firefox()
driver.get("http://somedomain/url_that_delays_loading")
try:
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "myDynamicElement"))
)
finally:
driver.quit()