расположение элемента поискового запроса, идентифицированного для селена в python - PullRequest
0 голосов
/ 19 июня 2020

Я использую Python и Selenium в PyCharm для go на веб-сайте SE C для загрузки файла CSV размером 10 КБ. В идеале программа должна запрашивать у пользователя ввод «тикерного символа», затем go на веб-сайт SE C, вводить предоставленный тикерный символ и загружать CSV-файлы 10-K и 10-Q со страницы. . Я использовал символ тикера Microsoft (MSFT) в качестве примера теста. Веб-сайт поиска Эдгара SE C выглядит так:

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)

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 19 июня 2020

Рассмотрите возможность использования метода waitUntil или Implicit / Explicit waits для ожидания загрузки элемента. Таким образом, вы можете обойти ошибку, показанную выше, код ниже для метода ожидания.

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();
...