[FIXED] Python-Selenium-Hilfe – NoSuchElementException

Problem

Ich erhalte bereits die Daten, die ich benötige (von einem Drucktest), aber ich denke, der Webdriver sucht weiterhin nach Elementen, sodass er einen Fehler zurückgibt. Ich habe meinen Code unten eingefügt, jede Hilfe wäre willkommen. Danke!

import datetime
import pandas as pd
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
url = 'https://www.finder.com.au/home-loans'
driver.get(url)

driver.execute_script("window.scrollTo(0, 2080)") 

get_today = datetime.datetime.now()
today = get_today.strftime('%d/%m/%Y')
affiliate = 'Finder'
rank = 1

results = []

loans = WebDriverWait(driver, 30).until(EC.presence_of_all_elements_located((By.XPATH, '//*[@id="comparison-table-0000000000"]//*')))

for i in range(1, len(loans)):
#     loan_listing = WebDriverWait(driver, 30).until(EC.presence_of_element_located((By.XPATH, f'//*[@id="comparison-table-0000000000"]/tbody/tr[{i}]//a[1]'))).text
    loan_listing = driver.find_element(By.XPATH, f'//*[@id="comparison-table-0000000000"]/tbody/tr[{i}]//a[1]').text
    print(loan_listing.split(' ', 1))

Es druckt bereits die Werte, die ich suche:

Ergebnisse drucken

Aber nach ein paar Sekunden gibt auch dieser Fehler zurück:

Fehlermeldung

Lösung

Das Problem ist:

Dieser XPath
'//*[@id="comparison-table-0000000000"]//*'ist zu allgemein, er stimmt mit mehr als 1500 Elementen auf dieser Seite überein, sodass diese loansListe viele irrelevante Elemente enthält.

Danach drucken Sie die Texte von Elementen, die zu diesem XPath passen:
//*[@id="comparison-table-0000000000"]/tbody/tr[{i}]//a[1]. Dazu passen 20 Elemente pro Seite. Die ersten 20 Ergebnisse werden also korrekt gedruckt, aber Ihre Schleife wird fortgesetzt, da die Länge der loansListe viel länger ist.

Um Ihren Code zu verbessern, können Sie diese Zeile
loans = WebDriverWait(driver, 30).until(EC.presence_of_all_elements_located((By.XPATH, '//*[@id="comparison-table-0000000000"]//*')))so korrigieren, dass nur relevante Elemente wie folgt gefunden werden:

loans = WebDriverWait(driver, 30).until(EC.presence_of_all_elements_located((By.XPATH, '//*[@id="comparison-table-0000000000"]/tbody/tr//a[@class="nameLink']")))

Oder auch

loans = WebDriverWait(driver, 30).until(EC.presence_of_all_elements_located((By.XPATH, '//*[@id="comparison-table-0000000000"]//a[@class="nameLink"]')))

Hier habe ich den aElement-Locator genauer definiert und jetzt passt dieser Locator nur noch auf 20 relevante Elemente


Beantwortet von –
Prophet


Antwort geprüft von –
Willingham (FixError Volunteer)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like