Как получить значения из поисковых предложений после ввода текста с использованием python селена? - PullRequest
1 голос
/ 07 мая 2020

Когда вы вводите что-то, например яблоко в строку поиска по адресу https://finance.yahoo.com/, появляется меню поисковых предложений.

enter image description here

Я пытаюсь заставить его вернуть список, словарь или фрейм данных значений в этом раскрывающемся списке.

Например,

{'AAPL':['Apple Inc.','Equity - NMS','https://finance.yahoo.com/quote/AAPL?p=AAPL&.tsrc=fin-srch'],
 'AAPL.BA':['Apple Inc.','Equity - BUE','https://finance.yahoo.com/quote/AAPL.BA?p=AAPL.BA&.tsrc=fin-srch'],
  .....}

или

['AAPL','Apple Inc.','Equity - NMS','https://finance.yahoo.com/quote/AAPL?p=AAPL&.tsrc=fin-srch']
['APPL.BA','Apple Inc.','Equity - BUE','https://finance.yahoo.com/quote/AAPL.BA?p=AAPL.BA&.tsrc=fin-srch']

Последнее значение - это гиперссылка при нажатии на ссылку.

Вот мой код,

options = Options()

driver = webdriver.Chrome(executable_path=r'C:\Program Files\chromedriver\chromedriver.exe',options=options)

url = "https://finance.yahoo.com/"
driver.get(url)
time.sleep(2)

inputElement = driver.find_element_by_xpath('//*[@id="yfin-usr-qry"]')
inputElement.send_keys('apple')
time.sleep(2)

web_elem_list = driver.find_elements_by_xpath(".//ul[@class='M(0)']/li/div/div")
suggests = [web_elem.text for web_elem in web_elem_list]

print(suggests)

driver.close()

Но вывод продолжает оставаться пустым, я не могу найти элементы в поле предложений.

Я также пробовал использовать web_elem_list = driver.find_elements_by_xpath(".//ul[@class='f470fc71']/li/div/div")

Но у него нет никаких значений.

Как мне,

  1. Найдите xpath окна предложений?
  2. Создайте фрейм данных, словарь или список всех результатов (включая гиперссылку).

ОБНОВЛЕНИЕ:

Я понял первую часть вопроса, в xpath было слишком много / div. Я обновил свой вопрос, и часть кода теперь работает.

Но я все еще не понял вторую часть вопроса, я все еще не могу получить часть «Equity - NMS» и гиперссылки.

Ответы [ 2 ]

2 голосов
/ 07 мая 2020

Внесены некоторые изменения в ваш скрипт в отношении ожидания и xpaths. Результатом будут предложенные данные в pandas фрейме данных.

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

options=webdriver.ChromeOptions()
options.add_argument('start-maximized')

driver = webdriver.Chrome(options=options)
url = "https://finance.yahoo.com/"
driver.get(url)

WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="yfin-usr-qry"]'))).send_keys('apple')

WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div//*[contains(text(),'Symbols')]")))
web_elem_list = driver.find_elements_by_xpath(".//div[@data-test='search-assist-input-sugglst']/div/ul[1]/li/div")
results = pd.DataFrame()

for web_elem in web_elem_list:
    suggests=[]

    code=web_elem.find_element_by_xpath("./div/div").text
    suggests.append(code)

    name=web_elem.find_element_by_xpath("./div/div/following-sibling::div").text
    suggests.append(name)

    equity=web_elem.find_element_by_xpath("./div/following-sibling::div").text
    suggests.append(equity)

    hyperlink=f'https://finance.yahoo.com/quote/{code}?p={code}&.tsrc=fin-srch'
    suggests.append(hyperlink)

    results=results.append(pd.Series(suggests), ignore_index=True)

print(results)

driver.close()

Вывод: enter image description here

0 голосов
/ 07 мая 2020

Это сработало для меня:

driver.find_elements_by_css_selector("ul[class=f470fc71] li[role=link][data-type=quotes]")
suggestions = [web_elem.get_attribute("title") for web_elem in web_elem_list]

вывод:

['Apple Inc.', 'Apple Hospitality REIT, Inc.', 'Apple Inc.', 'Apple Rush Company, Inc.', 'Apple Inc.', 'ApplePie Capital']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...