【问题标题】:Selenium clicking next button programmatically until the last pageSelenium 以编程方式单击下一步按钮,直到最后一页
【发布时间】:2018-11-04 11:58:33
【问题描述】:

嗨,我是网络抓取的新手,一直在尝试使用 Selenium 在 python 中抓取 forum

我试图让 Selenium 单击“下一步”直到最后一页,但我不知道如何打破循环。我在使用定位器时遇到了问题:

当我通过部分链接找到下一个按钮时,自动点击将继续到下一个线程,例如第1页->第2页->下一个线程->下一个线程的第1页->下一个线程的第2页

while True:
    next_link = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.PARTIAL_LINK_TEXT, "Next")))
    next_link.click()

当我通过类名找到下一个按钮时,自动点击会在到达最后一页时点击“上一个”按钮

while True:
    next_link = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CLASS_NAME, "prevnext")))
    next_link.click()

我的问题是:

  1. 我应该使用哪个定位器? (按类别或部分链接或任何 其他建议?
  2. 如何打破循环,使其在到达 最后一页?

【问题讨论】:

  • 分享分页块的 HTML 代码。还为到达和未到达最后一页的情况共享“下一步”按钮的 HTML
  • 你可以使用任何你想要的选择器,如果它工作的话。在这种情况下,我通常使用 id 或 xpath。插入带有可以确定最后一页的条件的 If 语句,并在其中插入 break; 语句

标签: python selenium web-scraping


【解决方案1】:

您需要考虑以下几点:

  • 页面上有两个元素,其文本为 Next,一个位于 Top,另一个位于 Bottom,因此您需要决定您希望与哪个元素进行交互并构建一个独特的Locator Strategy
  • 继续前进,因为您想在元素上调用 click() 而不是 expected-conditions 作为 presence_of_element_located(),您需要使用 element_to_be_clickable()
  • 当没有文本为 Next 的元素时,您需要执行剩余的步骤,因此请在 try-catch 块中调用 click() 并以防万一异常 break 出局。
  • 根据您的要求,xpath 作为 Locator Strategy 对我来说看起来不错。
  • 这是工作代码块:

    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
    
    options = webdriver.ChromeOptions() 
    options.add_argument("start-maximized")
    options.add_argument('disable-infobars')
    driver=webdriver.Chrome(chrome_options=options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
    driver.get("https://forums.hardwarezone.com.sg/money-mind-210/hdb-fully-paid-up-5744914.html")
    driver.find_element_by_xpath("//a[@id='poststop' and @name='poststop']//following::table[1]//li[@class='prevnext']/a").click()
    while True:
        try :
            WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//a[@id='poststop' and @name='poststop']//following::table[1]//li[@class='prevnext']/a[contains(.,'Next')]"))).click()
        except :
            print("No more pages left")
            break
    driver.quit()
    
  • 控制台输出:

    No more pages left
    

【讨论】:

    【解决方案2】:

    您可以使用以下代码单击“下一步”按钮,直到到达最后一页,如果该按钮不存在,则中断循环:

    from selenium.common.exceptions import TimeoutException
    
    while True:
        try:
            WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.LINK_TEXT, "Next ›"))).click()
        except TimeoutException:
            break
    

    【讨论】:

    • 非常感谢!这解决了我的问题。之前我意识到我的错误是我使用 Next ›而不是 Next >
    【解决方案3】:
    1. 您可以使用任何提供唯一标识的定位器。最佳做法按以下顺序说明。

      • 身份证
      • 姓名
      • 类名
      • CSS 选择器
      • Xpath
      • 其他
    2. 当没有找到可以使用的元素时退出while循环,如下所示。 break 命令用于相同的目的。

      while True:
          try:
              next_link = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CLASS_NAME, "prevnext")))
              next_link.click()
          except TimeoutException:
              break
      

    【讨论】:

    • 谢谢。但是通过使用“prevnext”,它会产生无休止的点击,因为在最后一页,有一个“Prev”按钮,它也位于使用“prevnext”。这是我以前的问题。
    猜你喜欢
    • 2023-01-20
    • 1970-01-01
    • 2018-12-08
    • 2018-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-05
    相关资源
    最近更新 更多