我陷入了一种奇怪的分页情况。我正在从 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('ctl00$cphMain$lrrgResults$cgvNamesDir','Page$2')">2</a></td>
<td><a href="javascript:__doPostBack('ctl00$cphMain$lrrgResults$cgvNamesDir','Page$3')">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('ctl00$cphMain$lrrgResults$cgvNamesDir','Page$2')">2</a></td>
<td><a href="javascript:__doPostBack('ctl00$cphMain$lrrgResults$cgvNamesDir','Page$3')">3</a></td>
<td><a href="javascript:__doPostBack('ctl00$cphMain$lrrgResults$cgvNamesDir','Page$4')">4</a></td>
<td><a href="javascript:__doPostBack('ctl00$cphMain$lrrgResults$cgvNamesDir','Page$5')">5</a></td>
<td><a href="javascript:__doPostBack('ctl00$cphMain$lrrgResults$cgvNamesDir','Page$6')">6</a></td>
<td><a href="javascript:__doPostBack('ctl00$cphMain$lrrgResults$cgvNamesDir','Page$7')">7</a></td>
<td><a href="javascript:__doPostBack('ctl00$cphMain$lrrgResults$cgvNamesDir','Page$8')">8</a></td>
<td><a href="javascript:__doPostBack('ctl00$cphMain$lrrgResults$cgvNamesDir','Page$9')">9</a></td>
<td><a href="javascript:__doPostBack('ctl00$cphMain$lrrgResults$cgvNamesDir','Page$10')">10</a></td>
<td><a href="javascript:__doPostBack('ctl00$cphMain$lrrgResults$cgvNamesDir','Page$11')">...</a></td>
<td><a href="javascript:__doPostBack('ctl00$cphMain$lrrgResults$cgvNamesDir','Page$Last')">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/