Как взять элемент с веб-страницы - PullRequest
1 голос
/ 23 апреля 2020

Я пытаюсь получить первые 5 элементов из Yahoo Finance ( TTD, WST, TDG, ODFL, VMI ) и поместить их в список с помощью селена.

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.action_chains import ActionChains 
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys


driver = webdriver.Chrome()
driver.get('https://finance.yahoo.com/gainers')

change = driver.find_element_by_xpath('//span[text()="Change"]')
actions = ActionChains(driver)
#stockname = driver.find_element_by_id('')

for i in range(2):
    WebDriverWait(driver, 3600).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="scr-  res-table"]/div[1]/table/thead/tr/th[4]'))).click()


link = driver.find_elements_by_class_name('Fw(600)')
print(link.text)

Ответы [ 2 ]

0 голосов
/ 23 апреля 2020

Вы можете попробовать этот пакет python: yahooquery . Вот как вы будете делать то, что делаете выше:

import pandas as pd
from yahooquery import Screener

s = Screener()
data = s.get_screeners('day_gainers', 5)
df = pd.DataFrame(data['day_gainers']['quotes']) 
0 голосов
/ 23 апреля 2020

Это очень сложно. Если вы нажмете на ссылку change, не знаете, сколько раз кликнуть, чтобы получить нужный элемент, так как эта информация не всегда появляется в первом клике.

Попробовать Ниже кодовая надежда это помогает.

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


driver = webdriver.Chrome()
driver.get('https://finance.yahoo.com/gainers')
#Cookie pop up to handle if not there then ignore
driver.maximize_window()
WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,"//button[text()='I agree']"))).click()
driver.execute_script("window.scrollTo(0, 250)")
element=WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,'//*[@id="scr-res-table"]/div[1]/table/thead/tr/th[4]/span[text()="Change"]')))
driver.execute_script("arguments[0].click();", element)
while(True):
    try:
        print("running...")
        WebDriverWait(driver,5).until(EC.presence_of_element_located((By.XPATH, "//a[text()='TTD']")))
        tablerows = WebDriverWait(driver, 10).until(EC.visibility_of_all_elements_located((By.XPATH, "//div[@id='fin-scr-res-table']//table[1]/tbody//tr")))
        for row in tablerows:
            if row.find_element_by_xpath("./td[1]").text in ['TTD', 'WST', 'TDG', 'ODFL', 'VMI']:
                coldata = [td.text for td in row.find_elements_by_xpath(".//td") if td.text != '']
                print(coldata)
        break

    except:
          print("exception block")
          driver.execute_script("arguments[0].click();", element)
          continue 

Это будет печатать на консоли следующим образом. Вы можете удалить неиспользуемую опцию печати. ​​

running...
exception block
running...
exception block
running...
['WST', 'West Pharmaceutical Services, Inc.', '187.61', '+17.49', '+10.28%', '431,280', '509,179', '13.854B', '58.45']
['TTD', 'The Trade Desk, Inc.', '260.30', '+16.11', '+6.60%', '2.135M', '2.115M', '11.971B', '114.55']
['TDG', 'TransDigm Group Incorporated', '318.01', '+13.75', '+4.52%', '262,441', '847,228', '17.073B', '24.77']
['ODFL', 'Old Dominion Freight Line, Inc.', '138.97', '+10.72', '+8.36%', '765,680', '939,080', '16.607B', '27.21']
['VMI', 'Valmont Industries, Inc.', '115.11', '+9.64', '+9.14%', '143,588', '138,449', '2.478B', '16.30']

ОБНОВЛЕНИЕ

Получить только первые пять записей из таблицы.

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


driver = webdriver.Chrome()
driver.get('https://finance.yahoo.com/gainers')
#Cookie pop up to handle if not there then ignore
driver.maximize_window()
WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,"//button[text()='I agree']"))).click()
tablerows = WebDriverWait(driver, 10).until(EC.visibility_of_all_elements_located((By.XPATH, "//div[@id='fin-scr-res-table']//table[1]/tbody//tr")))
for row in tablerows[:5]:
    coldata = [td.text for td in row.find_elements_by_xpath(".//td") if td.text != '']
    print(coldata)

Вывод :

['RLLCF', 'Rolls-Royce Holdings plc', '0.0125', '+0.0050', '+66.67%', '38.796M', '3.637M', '272.509B', 'N/A']
['IMMU', 'Immunomedics, Inc.', '27.00', '+5.01', '+22.78%', '20.966M', '3.661M', '5.776B', 'N/A']
['PBI-PB', 'Pitney Bowes Inc. NT 43', '15.20', '+2.33', '+18.12%', '116,008', 'N/A', '2.833B', '11.53']
['KZMYY', 'KAZ Minerals PLC', '2.7500', '+0.3552', '+14.83%', '34,267', '44,605', '2.555B', '4.70']
['FWONK', 'Formula One Group', '29.39', '+3.59', '+13.91%', '3.22M', '2.083M', '6.742B', 'N/A']
...