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_wait
wartet auf das Vorhandensein eines Elements , während Sie warten müssen, bis das Element anklickbar ist. Dies ist ein ausgereifterer Elementstatus. WebDriverWait
ist 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)