硒单击到下一页,直到最后一页

时间:2018-06-28 23:20:34

标签: python selenium selenium-webdriver web-scraping selenium-chromedriver

我试图一直单击此website的下一页,每次将表数据附加到一个csv文件中,然后当我到达最后一页时,附加表数据并中断while循环

不幸的是,由于某种原因,它一直停留在最后一页,我尝试了几种不同的方法来捕获错误

while True:
  try :
      WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.LINK_TEXT, 'Next'))).click()
  except :
      print("No more pages left")
      break
driver.quit()

我也尝试过这个:

try:
    link = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR,'.pagination-next a')))
    driver.execute_script('arguments[0].scrollIntoView();', link)
    link.click()
except:
    keep_going = False

我尝试放入打印语句,但始终停留在最后一页。

这是下一个按钮的首页/最后一页的HTML,我不确定是否可以利用此功能来做一些事情: 第一页的HTML:

<li role="menuitem" ng-if="::directionLinks" ng-class="{disabled: noNext()||ngDisabled}" class="pagination-next" style=""><a href="" ng-click="selectPage(page + 1, $event)" ng-disabled="noNext()||ngDisabled" uib-tabindex-toggle="">Next</a></li>
    <a href="" ng-click="selectPage(page + 1, $event)" ng-disabled="noNext()||ngDisabled" uib-tabindex-toggle="">Next</a>
</li>

最后一页的HTML:

<li role="menuitem" ng-if="::directionLinks" ng-class="{disabled: noNext()||ngDisabled}" class="pagination-next disabled" style=""><a href="" ng-click="selectPage(page + 1, $event)" ng-disabled="noNext()||ngDisabled" uib-tabindex-toggle="" disabled="disabled" tabindex="-1">Next</a></li>
    <a href="" ng-click="selectPage(page + 1, $event)" ng-disabled="noNext()||ngDisabled" uib-tabindex-toggle="" disabled="disabled" tabindex="-1">Next</a>
</li>

4 个答案:

答案 0 :(得分:2)

您可以解决以下问题,

“下一个”按钮将一直启用到“最后一页”,并且在“最后一页”中将被禁用。

因此,您可以创建两个列表来查找已启用的按钮元素和已禁用的按钮元素。在任何时候,启用的元素列表或禁用的元素列表大小都将是一个。因此,如果禁用了元素,则可以中断while循环,否则请单击下一个按钮。

我对python语法不熟悉,因此,您可以转换下面的java代码然后使用它,它肯定可以工作。

代码:

    boolean hasNextPage=true;

    while(hasNextPage){
        List<WebElement> enabled_next_page_btn=driver.findElements(By.xpath("//li[@class='pagination-next']/a"));
        List<WebElement> disabled_next_page_btn=driver.findElements(By.xpath("//li[@class='pagination-next disabled']/a"));

        //If the Next button is enabled/available, then enabled_next_page_btn size will be one.
        // So,you can perform the click action and then do the action
        if(enabled_next_page_btn.size()>0){
            enabled_next_page_btn.get(0).click();
            hasNextPage=true;
        }else if(disabled_next_page_btn.size()>0){
            System.out.println("No more Pages Available");
            break;
        }
    }

答案 1 :(得分:2)

next_page_btn.index(0).click()无法正常工作,但是检查next_page_btn的len可以找到它是否是最后一页,因此我能够做到这一点。

while True:
    next_page_btn = driver.find_elements_by_xpath("//li[@class = 'pagination-next']/a")
    if len(next_page_btn) < 1:
        print("No more pages left")
        break
    else:
        WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.LINK_TEXT, 'Next'))).click()

非常感谢您的帮助!

答案 2 :(得分:1)

如何使用do / while循环并仅检查要在退出的下一个按钮的属性中包含的“ disabled”类? (对不起,语法。我只是把它们放在一起,还没有尝试过)

string classAttribute

try :

     do
     {
          IWebElement element = driver.findElement(By.LINK_TEXT("Next"))
          classAttribute = element.GetAttribute("class")
          element.click()
     }
     while(!classAttribute.contains("disabled"))

except :

     pass

driver.quit()

答案 3 :(得分:1)

xPath的按钮是:

//li[@class = 'pagination-next']/a

所以每次您需要加载下一页时,都可以单击此元素:

next_page_btn = driver.find_elements_by_xpath("//li[@class = 'pagination-next']/a")
next_page_btn.index(0).click()

注意:您应该添加一个逻辑:

while True:
    next_page_btn = driver.find_elements_by_xpath("//li[@class = 'pagination-next']/a")
    if len(next_page_btn) < 1:
        print("No more pages left")
        break
    else:
        # do stuff