用硒导航分页

时间:2016-09-16 14:59:25

标签: python loops selenium selenium-webdriver pagination

我陷入了一个奇怪的分页案例。我正在抓取https://cotthosting.com/NYRocklandExternal/LandRecords/protected/SrchQuickName.aspx

的搜索结果

我的搜索结果分为4类。

1)没有搜索结果

2)有一个结果页面

3)有多个结果页但少于12个结果页

4)结果页面超过12个。

对于案例1,这很容易,我只是路过。

results = driver.find_element_by_class_name('GridView')
if len(results)== 0:
    pass

对于案例2和3,我正在检查包含元素中的链接列表是否至少为1,然后单击它。

else:
    results_table = bsObj.find('table', {'class':'GridView'})
    sub_tables = results_table.find_all('table')
    next_page_links = sub_tables[1].find_all('a')
    if len(next_page_links) == 0
        scrapeResults()
    else:
        scrapeResults()
        ####GO TO NEXT PAGE UNTIL THERE IS NO NEXT PAGE

案例2和案例3的问题:作为我的控制,我可以在这里查看什么?

链接是第2,3页等的hrefs。但是棘手的部分是如果我在当前页面上,比如说第1页,我该如何确保我要进入第2页,当我在第2页时我怎么确定我要去第3页?第1页的结果列表的html如下

<table cellspacing="0" cellpadding="0" border="0" style="border-collapse:collapse;">
   <tr>
      <td>Page: <span>1</span></td>
      <td><a href="javascript:__doPostBack(&#39;ctl00$cphMain$lrrgResults$cgvNamesDir&#39;,&#39;Page$2&#39;)">2</a></td>
      <td><a href="javascript:__doPostBack(&#39;ctl00$cphMain$lrrgResults$cgvNamesDir&#39;,&#39;Page$3&#39;)">3</a></td>
   </tr>
</table>

我可以使用sub_tables[1]专门使用上面的bs4代码进入此表。

问题是我没有可以使用的下一个按钮。 html中的结果页面没有任何变化。除了链接之前的span中的数字之外,没有什么可以隔离当前页面。我希望它到达最后一页时停止

对于案例4,html看起来像这样:

<table cellspacing="0" cellpadding="0" border="0" style="border-collapse:collapse;">
   <tr>
      <td>Page: <span>1</span></td>
      <td><a href="javascript:__doPostBack(&#39;ctl00$cphMain$lrrgResults$cgvNamesDir&#39;,&#39;Page$2&#39;)">2</a></td>
      <td><a href="javascript:__doPostBack(&#39;ctl00$cphMain$lrrgResults$cgvNamesDir&#39;,&#39;Page$3&#39;)">3</a></td>
      <td><a href="javascript:__doPostBack(&#39;ctl00$cphMain$lrrgResults$cgvNamesDir&#39;,&#39;Page$4&#39;)">4</a></td>
      <td><a href="javascript:__doPostBack(&#39;ctl00$cphMain$lrrgResults$cgvNamesDir&#39;,&#39;Page$5&#39;)">5</a></td>
      <td><a href="javascript:__doPostBack(&#39;ctl00$cphMain$lrrgResults$cgvNamesDir&#39;,&#39;Page$6&#39;)">6</a></td>
      <td><a href="javascript:__doPostBack(&#39;ctl00$cphMain$lrrgResults$cgvNamesDir&#39;,&#39;Page$7&#39;)">7</a></td>
      <td><a href="javascript:__doPostBack(&#39;ctl00$cphMain$lrrgResults$cgvNamesDir&#39;,&#39;Page$8&#39;)">8</a></td>
      <td><a href="javascript:__doPostBack(&#39;ctl00$cphMain$lrrgResults$cgvNamesDir&#39;,&#39;Page$9&#39;)">9</a></td>
      <td><a href="javascript:__doPostBack(&#39;ctl00$cphMain$lrrgResults$cgvNamesDir&#39;,&#39;Page$10&#39;)">10</a></td>
      <td><a href="javascript:__doPostBack(&#39;ctl00$cphMain$lrrgResults$cgvNamesDir&#39;,&#39;Page$11&#39;)">...</a></td>
      <td><a href="javascript:__doPostBack(&#39;ctl00$cphMain$lrrgResults$cgvNamesDir&#39;,&#39;Page$Last&#39;)">Last</a></td>
   </tr>
</table>

最后两个链接为...,表示有更多结果页面,Last表示最后一页。但是,“最后一个链接”存在于每个页面上,并且仅在最后一页本身上它不是活动链接。

案例4的问题,如何检查last链接是否可点击并将其用作我的停止点?

案例4的更大问题,我如何使...通过其他结果页面?结果页面列表最多为12个值。即最近十页到当前页面,...链接到更多页面和Last链接。所以,如果我的结果有88页,我不知道该怎么做。

我将转储链接到完整的示例页面:https://ghostbin.com/paste/nrb27

4 个答案:

答案 0 :(得分:1)

首先,你必须知道你在哪个页面。要实现它:

使用xpath:

查找当前页码的元素
currentPageElement = driver.find_element(By.XPATH, '//table[./tbody/tr/td[text()='Page: ']]//span')

然后提取数字:

currentPageNumber = int(currentPageElement.text)

然后你可以做任何事情:转到下一页只添加1到当前页码,转到最后一页并阅读号码等

答案 1 :(得分:1)

您应该做的是计算页面中的结果数量,并使用总结果中的值来估算通过除法的总页数。

如果你要检查页面,你会看到:`

Displaying records 1 - 500 of 32563 at 10:08 AM ET on 9/16/2016

知道页面的总数,开始导航并检查页面是否已加载,如果需要,并且知道当前页面,您可以根据页面导航页面导航编号的动态选择器:

  • 如果分页编号不是链接,那么您就在该页面上
  • 如果分页编号是一个链接,您可以使用它来点击

从那以后你不应该需要4个类别: - 您可以计算结果数量以及可以在页面上显示的数量 - 知道页数

  1. 创建一种方法,根据需要使用for或其他控制结构进行导航
  2. 为每个导航执行您需要执行的操作
  3. 或者转到最后一页并向后开始,直到第1页不是链接。

答案 2 :(得分:0)

点击&#34;最后一页&#34;获取他的号码,然后点击每个孩子。

答案 3 :(得分:0)

对我来说很简单。

driver.find_element_by_link_text("3").click()
driver.find_element_by_link_text("4").click()
....
driver.find_element_by_link_text("Last").click()