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:
Aber nach ein paar Sekunden gibt auch dieser Fehler zurück:
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 loans
Liste 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 loans
Liste 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 a
Element-Locator genauer definiert und jetzt passt dieser Locator nur noch auf 20 relevante Elemente
Beantwortet von – Prophet
Antwort geprüft von – Willingham (FixError Volunteer)