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))
Exemple #2
0
"""Загружает дивиденды и даты закрытия с сайта 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))