python - 使用 Selenium 导航分页

标签 python loops selenium selenium-webdriver pagination

我陷入了一种奇怪的分页情况。我正在从 https://cotthosting.com/NYRocklandExternal/LandRecords/protected/SrchQuickName.aspx 抓取搜索结果

我的搜索结果分为 4 类。

1) 没有搜索结果

2)只有一个结果页

3) 结果页数超过1个但少于12个结果页

4) 结果页面超过 12 个。

对于情况1,这很简单,我只是通过。

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

对于情况 2 和 3,我检查包含元素中的链接列表是否至少为一个,然后单击它。

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 页等的 href。但棘手的部分是,如果我在当前页面(例如第 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] 对此表进行清零,请参阅上面案例 2 中的 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

最佳答案

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

使用 xpath 查找具有当前页码的元素:

currentPageElement = driver.find_element(By.XPATH, '//table[./tbody/tr/td[text()='Page: ']]//span')

然后提取数字:

currentPageNumber = int(currentPageElement.text)

然后你可以做任何事情:转到下一页,只需在当前页码上加 1,转到最后一页并读取页码,等等

关于python - 使用 Selenium 导航分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39534584/

相关文章:

python - 如何使用 sqlalchemy-migrate 编写更改列名迁移?

python - 如何使用 Django 用数据库中的数据填充 HTML 下拉列表?

python - 如何在 Python 中将字符串转换为 "command"?

java - 如何在位于 iframe 中的富文本编辑器中使用 SendKeys(webdriver) 命令

selenium - seeOrWaitForElement 的代码接收函数

python - 无法使用 Python3 在 Ubuntu 上安装 selenium

python - 迭代每个文件夹中的 2 个文件并比较它们

java - 如何中断无限循环

javascript - jquery .click() 在循环内

C 编程,存储来自 for 循环的数据