如何使用 Selenium 在 Python 的网站上点击 Button/Link

How to Use Selenium to Click Button/Link on Website in Python

我是 Selenium 的新手,我对使用它的强大功能打开一堆文本文件以获取来自 USDA's website on commodity pricing 的每日报告很感兴趣。我的最终目标是为每种商品创建历史价格的时间序列。

数据在文本文件中。如果我有 link,我可以处理一个文本文件,然后我可以变成一个数据框进行分析,但是 我不知道如何在所有不同的文本文件上执行这个操作该页.

首先,我尝试了 BeautifulSoup,目的是将所有 link 收集到 HTML 代码中的文本文件并遍历它们。但我意识到这是行不通的,因为 link 到文本文件的源代码隐藏在 Javascript.

然后,我决定试试 Selenium。这里的想法是我可以单击不同的年份和月份来访问文本文件 links。我在这里遇到过类似的问题,但我似乎无法让 clicking 正常工作。

Firefox 会弹出正确的网站,但无论我如何尝试启动点击,我都会收到错误消息。这些错误告诉我,我看到的东西与我检查元素时 Selenium 看到的不同。

感兴趣的可以看看上面的link

关于如何解决这个问题有什么想法吗?这是我尝试打开“2020s”文件夹的示例。

from selenium import webdriver

driver = webdriver.Firefox(executable_path=r'C:\Users\xxx\Downloads\geckodriver-v0.30.0-win64\geckodriver.exe')
driver.get('https://mymarketnews.ams.usda.gov/viewReport/2837')

#link = driver.find_element_by_link_text("2020s")
#link = driver.find_element_by_link_xpath('//*[@id="2020s"]').click()
link = driver.find_element_by_css_selector('# 020s > a:nth-child(1)').click()

这些错误取决于三个 find_element_by_click 行中的哪一行 运行:

NoSuchElementException: Unable to locate element: 2020s

NoSuchElementException: Unable to locate element: //*[@id="2020s"]

InvalidSelectorException: Given css selector expression "# 020s > a:nth-child(1)" is invalid: InvalidSelectorError: Document.querySelector: '# 020s > a:nth-child(1)' is not a valid selector: "# 020s > a:nth-child(1)"

我附上了 HTML 我在单击 2020s link/button 之前在检查元素模式中看到的图像 link/button。

尝试使用这个 CSS 选择器:

"#2020s > a"

或Xpath

"//*[@id='2020s']/a"

也尝试在 driver.get()

之后添加一些等待

https://selenium-python.readthedocs.io/waits.html

driver.get() 不会等待 AJAX 请求完成才返回。您尝试点击的元素是通过 AJAX 请求创建的,在您尝试点击它时尚不存在。

要解决这个问题,您必须首先等待创建元素,如以下代码所示。

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

driver = webdriver.Firefox(executable_path='xxx/geckodriver.exe'))
driver.get('https://mymarketnews.ams.usda.gov/viewReport/2837')
WebDriverWait(driver, timeout=10).until(EC.presence_of_element_located((By.ID, '2020s')))
elt = driver.find_element(By.XPATH, '//*[@id="2020s"]/a')
elt.click()

在您继续处理此项目时需要注意的另外两件事是