Из-за недавней волатильности фондового рынка можно было бы колебаться при входе на рынок. Это может быть возможностью пересмотреть свои инвестиционные стратегии и найти активы, которые могут быть недооценены напуганным рынком. Оценка финансовой отчетности имеет основополагающее значение для инвестиций, основанных на стоимости. Яху! Finance предоставляет легкодоступные финансовые данные о публично торгуемых компаниях, которые можно получить с помощью нескольких простых команд.

В этой статье мы напишем простое программирование на Python для очистки данных финансовой отчетности от Yahoo! Финансируйте с помощью Beautiful Soup и Selenium.

Начнем с финансовых показателей Yahoo! Финансы на примере Microsoft (MSFT):

На странице показаны годовые консолидированные отчеты о прибылях и убытках с 2019 по 2022 год, а также за последние 12 месяцев (TTM) с некоторыми разбивками, скрытыми между строками.

Чтобы очистить все данные через HTML, включая скрытые строки, мы должны сначала отобразить все данные с помощью Selenium. Selenium позволяет нам взаимодействовать с браузером с помощью команд Python. Нам нужно использовать несколько библиотек:

from selenium import webdriver 
from selenium.webdriver.common.by import By 
from selenium.webdriver.chrome.options import Options 
import time

Во-первых, мы определяем страницу, из которой мы хотим извлечь данные, и открываем ее с помощью веб-драйвера. ChromeDriver необходимо скачать заранее.

url = 'https://finance.yahoo.com/quote/MSFT/financials?p=MSFT'  
options = Options() 
options.page_load_strategy = 'eager' 
browser = webdriver.Chrome(options=options) browser.get(url)

Опция «нетерпеливый» позволяет нам получить доступ к DOM раньше других ресурсов, таких как изображения, что сокращает время загрузки процесса.

Мы определяем кнопку «Развернуть все» и отображаем все скрытые строки с помощью команды click(). Для загрузки страницы установлен период ожидания 2 секунды.

expand_all = browser.find_element(By.XPATH, '//button[contains(@class,"expandPf")]') 
expand_all.click() 
time.sleep(2)

Теперь, когда отображаются все строки, мы можем извлечь HTML-код с помощью BeasutifulSoup. Все числовые значения находились под тегом ‹div› с классом «Ta(c)», тогда как имена строк можно было идентифицировать с классом «D(ib)».

from bs4 import BeautifulSoup 
html_page = BeautifulSoup(browser.page_source, 'html.parser')  
data = [] 
for d in html_page.find_all('div', {'class': ['D(ib)', 'Ta(c)']}):
   data.append(d.string)

Финансовые данные и имена строк были извлечены с некоторыми пустыми значениями и другой несвязанной информацией.

Мы выполняем простую очистку данных, сначала определяя, где наши данные начинаются с («ttm»), а затем извлекаем все данные, прежде чем преобразовать их в фрейм данных для экспорта.

import pandas as pd  
start = data.index('ttm') 
data2 = data[start-1:] 
data2 = list(zip(*[iter(data2)]*6)) pd.DataFrame(data2[0:])

Некоторые имена строк отсутствуют, они не были напрямую написаны в виде текста в HTML. Однако это не должно сильно повлиять на извлекаемые нами данные, поэтому в этом руководстве мы не будем рассматривать его. Аналогичные методы можно использовать для извлечения данных из баланса и отчета о движении денежных средств для финансового анализа компании.