python中为selenium标识的搜索输入词元素的位置

2024-04-27 09:07:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我在PyCharm中使用Python和Selenium去SEC网站下载一个10-K CSV文件。理想情况下,程序应要求用户输入“股票代码”,然后访问SEC网站,输入提供的股票代码,并从页面下载10-K和10-Q CSV文件。我使用了微软的股票代码(MSFT)作为示例测试。SEC的Edgar搜索网站如下:

https://www.sec.gov/edgar/searchedgar/companysearch.html

我正在使用“快速搜索”搜索引擎。我创建了一个函数“get_edgar_results”来执行此下载。可能是因为我对网页抓取还不熟悉,但我想我已经正确地识别了HTML标签,将搜索词放在了哪里。以前的问题表明,我可能需要让程序在搜索HTML元素之前等待,因此我添加了代码让程序等待。我继续得到这个错误: line 242, in check_response raise exception_class(message, screen, stacktrace) selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: [id="Find"]

我的代码如下:

import selenium.webdriver.support.ui as ui
from pathlib import Path
import selenium.webdriver as webdriver
ticker_symbol = input("please provide a ticker symbol: ")

def get_edgar_results(ticker_symbol):
    url = "https://www.sec.gov/edgar/searchedgar/companysearch.html"  
    driver = webdriver.Firefox(executable_path=r"C:\Program Files\JetBrains\geckodriver.exe") 
    wait = ui.WebDriverWait(driver,30) 
    driver.set_page_load_timeout(30) 
    driver.get(url)
    search_box = driver.find_element_by_id("Find")
    search_box.send_keys(ticker_symbol)
    search_box.submit()
    annual_links = driver.find_elements_by_class_name("10-K")
    quarterly_links = driver.find_elements_by_class_name("10-Q")
    results = []
    driver.close()
    driver.quit()
    return results


get_edgar_results(ticker_symbol)

任何帮助都将不胜感激


Tags: import程序uiget网站driverseleniumsec
1条回答
网友
1楼 · 发布于 2024-04-27 09:07:54

考虑使用waitUntilImplicit/Explicit waits方法等待加载元素为止。通过这种方式,您可以避免上面显示的错误,下面的代码用于wait-until方法

browser = webdriver.Firefox()
browser.get("url")
delay = 3 # seconds
try:
    myElem = WebDriverWait(browser, delay).until(EC.presence_of_element_located((By.ID, 'IdOfMyElement')))
    print "Page is ready!"
except TimeoutException:
    print "Loading took too much time!"

下面的代码中似乎也有错误

search_box = driver.find_element_by_id("Find")
search_box.send_keys(ticker_symbol)
search_box.submit()

id=find定位的是Search Box而不是input元素,因此将keys值发送给button是不正确的。我建议您使用xpath来唯一地定位您选择的元素

下面将向输入框发送一个值,并在SEARCH按钮上单击一个按钮

driver.findElement(By.xpath("//*[@id="lesscompany"])).sendKeys("your value");
driver.findElement(By.xpath("//*[@id="search_button_1"]")).click();

相关问题 更多 >