def test_make_df_validate(): table = parser.HTMLTableParser(HTML, 1) columns = [ parser.DataColumn(i, {0: RESULT1[0][i]}, parser.div_parser) for i in range(5) ] df = pd.DataFrame(DF_DATA[1:]) assert df.equals(table.make_df(columns, 1))
"""Загружает дивиденды и даты закрытия с сайта www.dohod.ru""" import ssl import urllib.error import urllib.request import pandas as pd from web.dividends import parser from web.labels import DATE TABLE_INDEX = 2 HEADER_SIZE = 1 DATE_COLUMN = parser.DataColumn(0, {0: 'Дата закрытия реестра'}, parser.date_parser) DIVIDENDS_COLUMN = parser.DataColumn(2, {0: 'Дивиденд (руб.)'}, parser.div_parser) def make_url(ticker: str): """Формирует url - тикер необходимо перевести в маленькие буквы""" ticker = ticker.lower() return f'http://www.dohod.ru/ik/analytics/dividend/{ticker}' def get_html(url: str): """Получает html-код для url""" try: with urllib.request.urlopen(url, context=ssl.SSLContext()) as response: return response.read()
"""Загружает данные по предстоящим дивидендам с https://www.smart-lab.ru""" from web.dividends import dohod_ru, parser from web.labels import TICKER, DATE, DIVIDENDS URL = 'https://smart-lab.ru/dividends/index/order_by_yield/desc/' TABLE_INDEX = 2 HEADER_SIZE = 1 FOOTER_SIZE = 1 TICKER_COLUMN = parser.DataColumn(1, {0: 'Тикер', -1: '\n+добавить дивиденды\nИстория выплаченных дивидендов\n'}, lambda x: x) DATE_COLUMN = parser.DataColumn(4, {0: 'дата отсечки', -1: '\n+добавить дивиденды\nИстория выплаченных дивидендов\n'}, parser.date_parser) DIVIDENDS_COLUMN = parser.DataColumn(7, {0: 'дивиденд,руб', -1: '\n+добавить дивиденды\nИстория выплаченных дивидендов\n'}, parser.div_parser) def dividends_smart_lab(): """ Возвращает ожидаемые дивиденды с сайта https://smart-lab.ru/ Returns -------
if data == NO_VALUE: return 0.0 data = re.search(DIV_PATTERN, data).group(0) data = data.replace(',', '.') return float(data) def date_parser(data: str): if data == NO_VALUE: return None date = re.search(DATE_PATTERN, data).group(0) return pd.to_datetime(date, dayfirst=True) DATE_COLUMN = parser.DataColumn(5, {0: 'Дата закрытия реестра акционеров', 1: 'Под выплату дивидендов'}, date_parser) COMMON_TICKER_LENGTH = 4 COMMON_COLUMN = parser.DataColumn(7, {0: 'Размер дивидендов\nна одну акцию, руб.', 1: 'АОИ'}, div_parser) PREFERRED_TICKER_ENDING = 'P' PREFERRED_COLUMN = parser.DataColumn(8, {0: 'Размер дивидендов\nна одну акцию, руб.', 1: 'АПИ'}, div_parser) def xpath_await_find(driver, xpath: str, waiting_time: int = WAITING_TIME):
def test_make_df_with_parsed_data(): table = parser.HTMLTableParser(HTML, 1) columns = [parser.DataColumn(i, {}, parser.div_parser) for i in range(5)] df = pd.DataFrame(DF_DATA) assert df.equals(table.make_df(columns))
def test_make_df(): table = parser.HTMLTableParser(HTML, 1) columns = [parser.DataColumn(i, {}, lambda x: x) for i in range(5)] df = pd.DataFrame(RESULT1) assert df.equals(table.make_df(columns))
def test_make_df_fail_validate(): table = parser.HTMLTableParser(HTML, 1) columns = [parser.DataColumn(1, {0: '2.2', 1: 'test'}, lambda x: x)] with pytest.raises(ValueError) as error: table.make_df(columns) assert error.value == 'Значение в таблице "5.55 (сов)" - должно быть "test"'
def test_make_df_drop(): table = parser.HTMLTableParser(HTML, 1) columns = [parser.DataColumn(i, {}, parser.div_parser) for i in range(5)] df = pd.DataFrame(DF_DATA[1:2]) assert df.equals(table.make_df(columns, 1, 1))