如何使用 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()
之后添加一些等待
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()
在您继续处理此项目时需要注意的另外两件事是
- CSS 选择器有一个限制,它们不能用于查找 ID 以数字开头的元素。
- 您需要直接单击 元素,而不是它周围的
- 元素。
我是 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()
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()
在您继续处理此项目时需要注意的另外两件事是
- CSS 选择器有一个限制,它们不能用于查找 ID 以数字开头的元素。
- 您需要直接单击 元素,而不是它周围的
- 元素。