Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.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 浏览器到达网页底部时无法退出循环_Python_Python 3.x_Selenium_Selenium Webdriver_Web Scraping - Fatal编程技术网

Python 浏览器到达网页底部时无法退出循环

Python 浏览器到达网页底部时无法退出循环,python,python-3.x,selenium,selenium-webdriver,web-scraping,Python,Python 3.x,Selenium,Selenium Webdriver,Web Scraping,我已经用python结合selenium编写了一个脚本来解析网页中所有可用的咖啡店名称。该网页已激活lazyloading方法,因此我可以在每个卷轴中看到40个名称。如果我滚动2次,那么可以看到的名称数是80,依此类推 该网页中有125个可用名称。我下面的脚本可以到达页面的底部,处理所有的滚动,但不能跳出循环来打印内容 这是我目前的脚本: from selenium import webdriver from selenium.webdriver.common.by import By from

我已经用python结合selenium编写了一个脚本来解析网页中所有可用的咖啡店名称。该网页已激活lazyloading方法,因此我可以在每个卷轴中看到40个名称。如果我滚动2次,那么可以看到的名称数是80,依此类推

该网页中有125个可用名称。我下面的脚本可以到达页面的底部,处理所有的滚动,但不能跳出循环来打印内容

这是我目前的脚本:

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.Chrome()
wait = WebDriverWait(driver, 4)
driver.get("https://www.yellowpages.ca/search/si/1/coffee/all%20states")

itemlist = []
while True:
    for elem in wait.until(EC.presence_of_all_elements_located((By.CLASS_NAME,"listing__name--link"))):
        if elem.text not in itemlist:
            itemlist.append(elem.text)

    try:
        driver.execute_script("arguments[0].scrollIntoView();",elem)
    except Exception:break

for item in itemlist:
    print(item)

driver.quit()
该页面的内容不会动态生成,因此我可以使用
请求
获取所有内容,只需更改url的这部分
/si/1/coffee/
。但是,我想使用selenium控制滚动来获取它们

Postscript:我不希望使用
驱动程序来解决问题。对范围(3)中的项目执行脚本(“window.scrollTo(0,document.body.scrollHeight)”
:elem.send_key(key.END)
,因为我已经成功地使用了它们


我所需要知道的就是如何在
中放入任何条件来打破循环。

中,而True
循环将布尔变量
done
设置为True。每当向列表中添加项目时,将其设置为false


在循环中断之外,如果
done=True

您可以尝试实现以下条件:如果在超时内条目数保持不变,则中断循环:


很高兴再次见到你@Anderson爵士。我尝试了你的脚本,但循环仍然在进行。脚本无法跳出它。@Topto,是的,我被
itemlist
弄糊涂了:我以为它是一个节点列表,但它是一个字符串列表。。。检查更新
itemlist = []
while True:
    for elem in wait.until(EC.presence_of_all_elements_located((By.CLASS_NAME,"listing__name--link"))):
        if elem.text not in itemlist:
            itemlist.append(elem.text)
    current_len = len(driver.find_elements_by_class_name("listing__name--link"))
    try:
        driver.execute_script("arguments[0].scrollIntoView();",elem)
        wait.until(lambda driver: len(driver.find_elements_by_class_name("listing__name--link")) > current_len)
    except Exception:break

for item in itemlist:
    print(item)

driver.quit()