0

Ich habe Code in Python in Kombination mit Selen geschrieben. Ich wollte den Tisch von einer Webseite analysieren. Ich habe es funktioniert. Es kommt jedoch zu Problemen, wenn ich versuche, auf die Schaltfläche für die nächste Seite zu klicken. Der Scraper analysiert die Tabelle nur von der ersten Seite und anstatt auf die nächste Schaltfläche zu klicken, wird die Eingabe beendet, ohne dass ein Fehler auftritt. Also, ich kann nicht verstehen, was ich vermisse. HierProblem beim Klicken auf die Schaltfläche für die nächste Seite

ist der vollständige Code für Ihre Überlegung:

from selenium import webdriver 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support.wait import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 

driver = webdriver.Chrome() 
wait = WebDriverWait(driver, 10) 

driver.get("https://toolkit.financialexpress.net/santanderam") 

wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, 'table.fe-datatable'))) 

tab_data = driver.find_element_by_css_selector('table.fe-datatable') 

while True: 
    wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, 'tr'))) 
    list_rows = [[cell.text for cell in row.find_elements_by_css_selector('td')] 
       for row in tab_data.find_elements_by_css_selector('tr')] 
    for data in list_rows: 
     print(data) 

    try: 
     driver.find_element_by_css_selector('a.ui-paging-next').click() 
    except: 
     break 

driver.quit() 

Elements, in dem die nächste Seite-Schaltfläche vorhanden ist:

<div class="pagination ui-widget"><span class="ui-paging-current ui-state-default ui-state-disabled ui-corner-all ui-paging-prev">Prev</span><span class="ui-paging-current ui-state-default ui-state-disabled ui-state-highlight ui-corner-all">1</span><a class="ui-paging-button ui-state-default ui-corner-all" href="#">2</a><a class="ui-paging-button ui-state-default ui-corner-all" href="#">3</a><a class="ui-paging-button ui-state-default ui-corner-all" href="#">4</a><span class="ui-state-default ui-corner-all ui-state-disabled ui-paging-ellipse">...</span><a class="ui-paging-button ui-state-default ui-corner-all ep" href="#">7</a><a class="ui-paging-button ui-state-default ui-corner-all ui-paging-next" href="#">Next</a></div> 
+1

Try driver.find_element_by_css_selector ("a [Klasse * ersetzen = 'ui-paging-next'] "). click() oder find_element_by_link_text ('Next'). click() – Grasshopper

+0

Danke Gr Asshopper, für Sie antworten. Es hat nicht den Trick mit CSS-Selektor, aber es scheint mit Link-Text zu arbeiten. Ich werde nach dem Testen zu Ihnen zurückkommen. Vielen Dank. – SIM

+0

Es klickt auf den Link, löst aber einen weiteren Fehler aus. "raise exception_class (message, screen, stacktrace) selen.common.exceptions.StaleElementReferenceException: Nachricht: veraltetes Element reference: Element ist nicht an das Seitendokument angehängt" – SIM

Antwort

1

@Grasshopper bereits mit einer Lösung zur Verfügung gestellt hat, aber ich werde versuchen Sie, mehr Details für Sie zu verstehen, warum Ihr Code fehlschlägt

Es gibt zwei Links mit der gleichen HTML Code in der Seite vorhanden: die erste ist versteckt, zweite (die eine, die Sie brauchen) ist nicht.

Sie können es mit

print(len(driver.find_elements_by_css_selector('a.ui-paging-next'))) 

Während CSS-Selektor oder XPath gibt man einfach das erste Vorkommen, Suche nach Linktext kommt mit dem sichtbaren Text verknüpfen nur:

print(len(driver.find_elements_by_link_text('Next'))) 

, deshalb, Ihr find_element_by_css_selector(...) Code funktioniert nicht, aber find_element_by_link_text(...) tut.

beachten Sie auch, dass die Linie

wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, 'table.fe-datatable'))) 

schon sollten Sie erforderliches Element zurückgeben, so gibt es keine Notwendigkeit, in

tab_data = driver.find_element_by_css_selector('table.fe-datatable') 

Gerade

verwenden
tab_data = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, 'table.fe-datatable'))) 

zu vermeiden Um StaleElementReferenceException bekommen Sie sollten Definieren Sie Ihre tab_data bei jeder Iteration neu alsAuf der ersten Seite definierteist auf der nächsten Seite nicht verfügbar. Einfach tab_data Definition innerhalb der while Schleife

UPDATE

In Ihrem Code try

try: 
    driver.find_element_by_link_text('Next').click() 
except: 
    break 

mit

first_row = driver.find_element_by_css_selector('table.fe-datatable tr.odd').text 
try: 
    driver.find_element_by_link_text('Next').click() 
except: 
    break 
wait.until(lambda driver: driver.find_element_by_css_selector('table.fe-datatable tr.odd').text != first_row) 
+0

Ich bekomme diesen Fehler in Zeile 192 und in meinem Skript kurz vor "für Daten in list_rows:". Zu Ihrer Information, bevor ich das Skript ausführte, nahm ich die tab_data-Inside-Schleife. Ich gebe eine Verbindung mit meinem korrigierten Code darin in einer Weile. Danke, mein Herr. – SIM

+0

Dies ist das Skript mit jetzt versuchen: "https://www.dropbox.com/s/kw71wircwbj5zv8/Rectified%20One.txt?dl=0" – SIM

+0

Überprüfen Sie den aktualisierten Code – Andersson

Verwandte Themen