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))
def _download(self, item: str, last_index: Optional[Any]) -> List[Dict[str, Any]]: url = f"https://www.dohod.ru/ik/analytics/dividend/{item.lower()}" with self._session.get(url) as respond: try: respond.raise_for_status() except requests.HTTPError: raise POptimizerError(f"Данные {url} не загружены") else: html = respond.text table = parser.HTMLTableParser(html, TABLE_INDEX) date_col = parser.DataColumn( DATE, 0, {0: "Дата закрытия реестра"}, parser.date_parser ) div_col = parser.DataColumn(item, 2, {0: "Дивиденд (руб.)"}, parser.div_parser) columns = [date_col, div_col] data = table.get_formatted_data(columns, HEADER_SIZE) return sort_and_group(item, data)
def test_get_formatted_data(): table = parser.HTMLTableParser(HTML, 1) columns = [ parser.DataColumn(f"col_{i}", i, {}, lambda x: x) for i in range(5) ] df = pd.DataFrame(RESULT1) df.columns = [f"col_{i}" for i in range(5)] rez = df.to_dict("records") assert rez == table.get_formatted_data(columns)
def test_get_formatted_data_validate(): table = parser.HTMLTableParser(HTML, 1) columns = [ parser.DataColumn(f"col_{i}", i, {0: RESULT1[0][i]}, parser.div_parser) for i in range(5) ] df = pd.DataFrame(DF_DATA[1:]) df.columns = [f"col_{i}" for i in range(5)] rez = df.to_dict("records") assert rez == table.get_formatted_data(columns, 1)
def test_get_formatted_data_with_parsed_data(): table = parser.HTMLTableParser(HTML, 1) columns = [ parser.DataColumn(f"col_{i}", i, {}, parser.div_parser) for i in range(5) ] df = pd.DataFrame(DF_DATA) df.columns = [f"col_{i}" for i in range(5)] rez = df.to_dict("records") assert rez == table.get_formatted_data(columns)
def _download(self, item: str, last_index: Optional[Any]) -> List[Dict[str, Any]]: while True: try: html = asyncio.run(get_html(item)) except asyncio.TimeoutError: continue else: break # noinspection PyUnboundLocalVariable table = parser.HTMLTableParser(html, TABLE_INDEX) date_column = parser.DataColumn( DATE, 5, { 1: "Дата закрытия реестра акционеров", 2: "Под выплату дивидендов" }, parser.date_parser, ) columns = [date_column] common_column = parser.DataColumn(item, 7, { 1: "Размер дивидендов", 2: "АОИ" }, parser.div_parser) preferred_column = parser.DataColumn(item, 8, { 1: "Размер дивидендов", 2: "АПИ" }, parser.div_parser) if is_common(item): columns.append(common_column) else: columns.append(preferred_column) data = table.get_formatted_data(columns, HEADER_SIZE) data = [row for row in data if row[DATE] is not None] return dohod.sort_and_group(item, data)
# Параметры поиска страницы эмитента SEARCH_URL = "https://www.conomy.ru/search" SEARCH_FIELD = '//*[@id="issuer_search"]' # Параметры поиска данных по дивидендам DIVIDENDS_MENU = '//*[@id="page-wrapper"]/div/nav/ul/li[5]/a' DIVIDENDS_TABLE = '//*[@id="page-container"]/div[2]/div/div[1]' # Параметры парсинга таблицы с дивидендами TABLE_INDEX = 1 HEADER_SIZE = 3 DATE_COLUMN = parser.DataColumn( 5, { 1: "Дата закрытия реестра акционеров", 2: "Под выплату дивидендов" }, parser.date_parser, ) COMMON_TICKER_LENGTH = 4 COMMON_COLUMN = parser.DataColumn(7, { 1: "Размер дивидендов", 2: "АОИ" }, parser.div_parser) PREFERRED_TICKER_ENDING = "P" PREFERRED_COLUMN = parser.DataColumn(8, { 1: "Размер дивидендов", 2: "АПИ" }, parser.div_parser)
from typing import Union, Tuple import aiohttp from poptimizer.config import POptimizerError from poptimizer.store import parser from poptimizer.store.manager import AbstractManager from poptimizer.store.utils import DATE # Данные хранятся в отдельной базе CATEGORY_DOHOD = "dohod" TABLE_INDEX = 2 HEADER_SIZE = 1 DATE_COLUMN = parser.DataColumn(0, {0: "Дата закрытия реестра"}, parser.date_parser) DIVIDENDS_COLUMN = parser.DataColumn(2, {0: "Дивиденд (руб.)"}, parser.div_parser) class Dohod(AbstractManager): """Информация о дивидендам с https://dohod.ru Каждый раз обновляется с нуля. """ CREATE_FROM_SCRATCH = True def __init__(self, ticker: Union[str, Tuple[str, ...]]): super().__init__(ticker, CATEGORY_DOHOD)
from poptimizer.store.utils import DATE, TICKER, DIVIDENDS # Наименование данных в коллекции MISC SMART_LAB = "smart-lab" # Параметры парсинга сайта URL = "https://smart-lab.ru/dividends/index/order_by_cut_off_date/asc/" TABLE_INDEX = 0 HEADER_SIZE = 1 FOOTER_SIZE = 1 TICKER_COLUMN = parser.DataColumn( TICKER, 1, { 0: "Тикер", -1: "\n+добавить дивиденды\nИстория выплаченных дивидендов\n" }, lambda x: x, ) DATE_COLUMN = parser.DataColumn( DATE, 9, { 0: "дата отсечки", -1: "\n+добавить дивиденды\nИстория выплаченных дивидендов\n" }, parser.date_parser, )
def test_get_formatted_data_raise_validate(): table = parser.HTMLTableParser(HTML, 1) columns = [parser.DataColumn("col", 1, {0: "2.2", 1: "test"}, lambda x: x)] with pytest.raises(POptimizerError) as error: table.get_formatted_data(columns) assert error.value == 'Значение в таблице "5.55 (сов)" - должно быть "test"'
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(POptimizerError) 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))
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))