我陷入了一个奇怪的分页案例。我正在抓取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('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]
专门使用上面的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
答案 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页不是链接。
答案 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()