Navigieren von Paginierung mit Selen

Ich stecke auf einem seltsamen Fall der Paginierung. Ich kratze die Suchergebnisse von https://cotthosting.com/NYRocklandExternal/LandRecords/protected/SrchQuickName.aspx

Ich habe Suchergebnisse, die in 4 Kategorien fallen.

1) Es gibt keine Suchergebnisse

2) Es gibt eine Ergebnisseite

3) Es gibt mehr als eine Ergebnisseite, aber weniger als 12 Ergebnisseiten

4) Es gibt mehr als 12 Ergebnisseiten.

Für Fall 1, das ist einfach, ich bin gerade vorbei.

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

Für die Fälle 2 und 3 überprüfe ich, ob die Liste der Links in dem enthaltenden Element mindestens eins ist und dann darauf klicken.

 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 

Frage für Fall 2 und 3: Was könnte ich hier als Kontrolle kontrollieren?

Die Links sind hrefs auf Seiten 2, 3, etc. Aber der heikle Teil ist, wenn ich auf einer aktuellen Seite bin, sage Seite 1, wie kann ich sicherstellen, dass ich auf Seite 2 gehe und wenn ich auf Seite 2 bin, wie gehe ich Stellen Sie sicher, dass ich auf Seite 3 gehe? Die html für Seite 1 für die Ergebnisliste ist wie folgt

 <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> 

Ich kann null in diese Tabelle speziell mit sub_tables[1] siehe oben bs4 Code in Fall 2.

Das Problem ist, dass es keine nächste Taste gibt, die ich nutzen könnte. Nichts ändert sich entlang der Ergebnisseiten im html. Es gibt nichts, um die aktuelle Seite neben der Nummer in der span direkt vor den Links zu isolieren. Und ich möchte, dass es aufhört, wenn es die letzte Seite erreicht

Für Fall 4 sieht das html wie folgt aus:

 <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> 

Die letzten beiden Links sind ... zu zeigen, dass es mehr Ergebnisse Seiten und Last , um die letzte Seite zu bedeuten. Allerdings ist die letzte Verbindung auf jeder Seite vorhanden und es ist nur auf der letzten Seite selbst, dass es sich nicht um einen aktiven Link handelt.

Frage für Fall 4, wie könnte ich überprüfen, ob der last Link anklickbar ist und diesen als Stopppunkt verwenden?

Größere Frage für Fall 4, wie kann ich das ... durch andere Ergebnisseiten gehen? Die Ergebnisliste beträgt maximal 12 Werte. Dh die nächsten zehn Seiten auf die aktuelle Seite, die ... Link zu mehr Seiten und der Last Link. Also weiß ich nicht was zu tun ist, wenn meine Ergebnisse 88 Seiten sagen.

Ich bin Link ein Dump zu einer vollständigen Beispielseite: https://ghostbin.com/paste/nrb27

3 Solutions collect form web for “Navigieren von Paginierung mit Selen”

Zuerst musst du wissen, auf welcher Seite du bist. Um es zu erreichen:

Element mit aktueller Seitenzahl suchen, mit xpath:

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

Dann extrahiere die Nummer:

 currentPageNumber = int(currentPageElement.text) 

Und dann kannst du alles machen: geh zur nächsten Seite, um nur 1 zur aktuellen Seitennummer hinzuzufügen, zur letzten Seite zu gehen und die Nummer zu lesen, etc

Was Sie tun sollten, ist, die Anzahl der Ergebnisse auf einer Seite zu zählen und den Wert aus den Gesamtresultaten zu verwenden, um die Gesamtzahl der Seiten durch Teilen zu schätzen.

Wenn Sie die Seite inspizieren, sehen Sie: `

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

Die Gesamtzahl der Seite zu kennen, die Navigation zu starten und zu überprüfen, welche Seite bei Bedarf geladen wird und die aktuelle Seite kennt man einen dynamischen Selektor für die Seitennavigation auf der Seite für 2 Fälle:

  • Wenn die Paginierungsnummer kein Link ist, dann sind Sie auf dieser Seite
  • Wenn die Paginierungsnummer ein Link ist, können Sie sie verwenden

Sie brauchen nicht 4 Kategorien, da: – Sie können die Anzahl der Ergebnisse zählen und wie viele können auf einer Seite angezeigt werden – kennen die Anzahl der Seiten

  1. Erstellen Sie eine Methode, um zu navigieren, wenn nötig mit einer für oder anderen Kontrollstruktur
  2. Für jede Navigation machst du was du tun musst

Oder gehen Sie zur letzten Seite und gehen Sie zurück, bis Seite 1 kein Link ist.

Klicken Sie auf die "letzte Seite", um seine Nummern zu erhalten, und klicken Sie dann in jedes Kind.

Python ist die beste Programmiersprache der Welt.