无法让selenium(python)下载csv文件,该文件没有链接,但仅在单击下载按钮后显示

无法让selenium(python)下载csv文件,该文件没有链接,但仅在单击下载按钮后显示,python,html,selenium,selenium-webdriver,Python,Html,Selenium,Selenium Webdriver,在我点击“所有年份”按钮后,我正在尝试从该网站下载csv文件 正如您所看到的,单击所有年份按钮的xpath是/html/body/div[1]/div[1]/div[3]/a[7] 这是所有年份按钮的html代码 <a class="zoom external-period-changer" data-period-label=" All ">All Years</a> 但我得到了以下错误: NoSuchElementException: Message: Unabl

在我点击“所有年份”按钮后,我正在尝试从该网站下载csv文件

正如您所看到的,单击所有年份按钮的xpath是/html/body/div[1]/div[1]/div[3]/a[7]

这是所有年份按钮的html代码

<a class="zoom external-period-changer" data-period-label=" All ">All Years</a>
但我得到了以下错误:

NoSuchElementException: Message: Unable to locate element: /html/body/div[1]/div[1]/div[3]/a[7]
首先,为什么我不能点击这个按钮?当我可以清楚地检查元素并看到它在那里

此外,通常大多数网站都会出现下载链接,我可以使用请求获取csv文件。但由于某些原因,链接没有出现

在python中使用selenium是否有任何方法或更好的方法下载此csv文件

编辑:

现在我根据答案添加了这个,并将代码更改为

start\u time=time.time()
选项=选项()
driver=webdriver.Firefox(可执行文件路径=r“/home/geckodriver/geckodriver”,options=options,)
profile=webdriver.FirefoxProfile()
profile.set_首选项('browser.download.folderList',2)#自定义位置
profile.set_首选项('browser.download.manager.showWhenStarting',False)
profile.set_首选项('browser.download.dir','/home/Documents/testing/macrotrends')
profile.set_首选项('browser.helperApps.neverAsk.saveToDisk','text/csv')
司机,上车https://www.macrotrends.net/1476/copper-prices-historical-chart-data')
时间。睡眠(5)
iframe=driver。通过xpath(“iframe[@id='chart\u iframe']”查找元素
驱动程序切换到帧(iframe)
xpath=“//a[text()=‘所有年份’”
通过xpath(xpath)查找元素
xpath=“//按钮[@id='dataDownload']”
通过xpath(xpath)查找元素
时间。睡眠(10)
驱动程序关闭()
打印(“--%s秒--”%(time.time()-start\u time))

这次我能找到元素,但它在无头模式下不起作用。感谢您的帮助

我看到您尝试单击的元素位于iframe元素中。 在单击之前,必须先切换到iframe

driver.get('https://www.macrotrends.net/1476/copper-prices-historical-chart-data')
iframe = driver.find_element_by_xpath("//iframe[@id='chart_iframe']")
driver.switch_to.frame(iframe)
xpath = "//a[text()='All Years']"
driver.find_element_by_xpath(xpath).click()
xpath = "//button[@id='dataDownload']"
driver.find_element_by_xpath(xpath).click()

我看到您尝试单击的元素位于iframe元素中。 在单击之前,必须先切换到iframe

driver.get('https://www.macrotrends.net/1476/copper-prices-historical-chart-data')
iframe = driver.find_element_by_xpath("//iframe[@id='chart_iframe']")
driver.switch_to.frame(iframe)
xpath = "//a[text()='All Years']"
driver.find_element_by_xpath(xpath).click()
xpath = "//button[@id='dataDownload']"
driver.find_element_by_xpath(xpath).click()

我在尝试从macrotrends.net下载csv文件时遇到了同样的问题

该站点似乎保护其下载“按钮”不受
的影响。单击()
,但我发现我可以使用selenium的键与之交互

那么一开始呢,

from selenium.webdriver.common.keys import Keys
然后,不要使用
。单击()

使用以下命令

driver.find_element_by_xpath(xpath).send_keys(Keys.ENTER)

现在应该可以下载该文件。

我在尝试从macrotrends.net下载csv文件时遇到了相同的问题

该站点似乎保护其下载“按钮”不受
的影响。单击()
,但我发现我可以使用selenium的键与之交互

那么一开始呢,

from selenium.webdriver.common.keys import Keys
然后,不要使用
。单击()

使用以下命令

driver.find_element_by_xpath(xpath).send_keys(Keys.ENTER)

该文件现在应该可以下载了。

-我在你提到的URL中看不到任何max按钮。我很抱歉我的错误,我的意思是多年来,我改变了我的问题,以反映我试图添加Wait=WebDriverWait(driver,5)。直到(EC.presence\u所有元素的位置((By.XPATH,/html/body/div[1]/div[1]/div[3]/a[7]'))但它只是说TimeoutException在你得到答案后不要改变问题。如果你有一个新问题,那么问一个新问题。当你已经选择了一个答案时,人们应该如何给出一个新的答案?我没有改变这个问题,我的问题最初是两部分。-在你提到的URL中,我看不到任何max按钮。很抱歉,我的错误是多年来一直存在的,我改变了我的问题,以反映我试图添加一个Wait=WebDriverWait(driver,5)。直到(EC.presence\u All\u元素的位置((By.XPATH,/html/body/div[1]/div[1]/div[3]/a[7]'))但它只是说TimeoutException在你得到答案后不要改变问题。如果你有一个新问题,那么问一个新问题。当你已经选择了一个答案时,人们应该如何给出一个新的答案?我没有改变问题,我的问题最初是两部分。好的,现在我可以找到该元素,但我仍然无法下载该文件。程序只是退出,没有下载任何东西。有什么想法吗?你需要在第二次点击(下载按钮)后给它一些延迟。请你看看我编辑的问题,我添加了你的答案,我添加了一个时间。睡眠(10),这样它就不会退出程序,但它仍然没有做任何事情。我做错了吗?嘿,代码是这样的,但我必须删除headless选项。你知道有没有办法让它在headless中工作?好的,现在我可以找到那个元素,但我仍然无法下载文件。程序只是退出,没有下载任何东西。有什么想法吗?你需要在第二次点击(下载按钮)后给它一些延迟。请你看看我编辑的问题,我添加了你的答案,我添加了一个时间。睡眠(10),这样它就不会退出程序,但它仍然没有做任何事情。我做错了吗?嘿,代码是这样的,但我必须删除headless选项。你知道有没有办法让它在无头状态下工作?