[FIXED] Wie kann ich eine CSV-Datei von einer Website herunterladen, deren Element ein Button ist bzw. die CSV-Datei über einen Button zugänglich ist?

Ausgabe

Ich versuche, eine CSV-Datei von einer Website herunterzuladen oder besser zu lesen. Die CSV-Datei ist unter einer Schaltfläche versteckt. Hier ist der Website-Link.

Die CSV-Datei, die ich zu speichern versuche, befindet sich ganz rechts und ist als blaue Schaltfläche mit der Aufschrift „Alle Daten im CSV-Format herunterladen“ gekennzeichnet.

Hier ist ein Beispielcode, den ich versucht habe, ihn herunterzuladen, aber der Download schlägt fehl:

# import the required libraries
from selenium import webdriver
from selenium.webdriver.common.by import By

options = webdriver.ChromeOptions()
prefs = {"download.default_directory" : "D:/Profession/Data Extraction and Web Scraping/Stocks Data Extraction - Core Scientific/Output"}

#example: prefs = {"download.default_directory" : "C:\Tutorial\down"};
options.add_experimental_option("prefs",prefs)

driver = webdriver.Chrome(executable_path="D:/Software/Selenium WebDrivers/chromedriver_win32/chromedriver", options=options)

try:
    driver.implicitly_wait(5)
    driver.get("https://defillama.com/chains")
    downloadcsv = driver.find_element(By.CLASS_NAME, 'sc-8f0f10aa-1')
    download_button = downloadcsv.find_element(By.TAG_NAME, 'button')
    download_button.click() # this should save it to the folder I specified in prefs
    time.sleep(3)
    driver.close()
except:
    print('There is an Error!')

Dieser Code versucht, die CSV-Datei herunterzuladen, der Download schlägt jedoch fehl. Gibt es eine bessere Möglichkeit, die CSV herunterzuladen, insbesondere eine, die sich unter einer Schaltfläche befindet? Vielen Dank!

Lösung

Sieht so aus, als müssten Sie eine geeignete Wartemethode verwenden.
implicitly_waitwartet auf das Vorhandensein eines Elements , während Sie warten müssen, bis das Element anklickbar ist. Dies ist ein ausgereifterer Elementstatus. WebDriverWaitist in solchen (und fast allen anderen) Fällen die beste Vorgehensweise.

Der folgende Code funktioniert:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

options = Options()
options.add_argument("start-maximized")

webdriver_service = Service('C:\webdrivers\chromedriver.exe')
driver = webdriver.Chrome(options=options, service=webdriver_service)
wait = WebDriverWait(driver, 10)

url = "https://defillama.com/chains"

driver.get(url)
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".sc-8f0f10aa-1 button"))).click()


Beantwortet von –
Prophet


Antwort geprüft von –
Clifford M. (FixError Volunteer)

0 Shares:
Leave a Reply

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

You May Also Like

[FIXED] Wie kann ich eine Option in einer Liste über Selen auswählen?

Ausgabe Mein Code ist: WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.XPATH, "//option[@value='/icpplustieb/citar?p=8&locale=es']"))).click() Die URL lautet: https://icp.administracionelectronica.gob.es/icpplus/index.html Ich möchte Barcelona als Region auswählen. Lösung Verwenden…