Получение Selenium CSV для загрузки в переменную python - PullRequest
0 голосов
/ 29 марта 2019

Когда я запускаю приведенный ниже код, открывается окно Chrome, страница загружается и файл CSV загружается в мои документы.

Однако я хочу загрузить файл CSV в список Python.

Когда я пытаюсь распечатать начальную загрузку, она показывает «Нет», а чтение в csv.reader показывает следующее сообщение об ошибке:

import csv
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

def getData()
    driver = webdriver.Chrome()
    driver.get(f"http://financials.morningstar.com/balance-sheet/bs.html?t=AAPL")
    button = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CLASS_NAME, "rf_export")))
    data = button.click()
    print(data)
    data = csv.reader(button)
    for row in data:
        print(row)
    return data

getData()


-------------


None
Traceback (most recent call last):
  File "helpers.py", line 403, in <module>
    newData2("AAPL")
  File "helpers.py", line 397, in newData2
    data = csv.reader(button)
TypeError: argument 1 must be an iterator

1 Ответ

1 голос
/ 29 марта 2019

Если вы посмотрите на кнопку загрузки на этой странице, это ссылка на следующую функцию javascript: SRT_stocFund.Export()

Просмотр этой функции (на http://financials.morningstar.com/finan/static/script/SRT_stockFund.js), она вызывает SRT_StockFund.GetPara(), и использует возвращенные данные для создания ссылки и изменяет местоположение вашего браузера на нее:

document.location = hostPath+"/ajax/ReportProcess4CSV.html?" + params+"&denominatorView="+denominatorView+"&number="+number;

В моем случае URL выглядел так:

"//financials.morningstar.com/ajax/ReportProcess4CSV.html?&t=XNAS:AAPL&region=usa&culture=en-US&cur=&reportType=bs&period=12&dataType=A&order=asc&columnYear=5&curYearPart=1st5year&rounding=3&view=raw&r=13805&denominatorView=raw&number=3"

То, что вы могли бы легко сделать в селене, это:

  • вызвать функцию GetPara()
  • создать URL-адрес загрузки самостоятельно.

Вы можете вызвать javascript изнутри Селена с помощью чего-то вроде: driver.execute_script('SRT_stocFund.GetPara()') - и затем создать свою строку, чтобы создать ссылку для загрузки, и получить ее.

Инструменты разработчика вашего браузера - ваш друг здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...