def _find_table_n(html: str) -> int: soup = bs4.BeautifulSoup(html, "lxml") tables = soup.find_all("table") for num, table in enumerate(tables): if "Цена на закрытии" in table.text: return num raise description.ParserError("Таблица не найдена.")
async def test_loader_get_html_error(mocker): """Регрессионный тест при ошибке загрузки данных из интернета.""" mocker.patch.object(invest_mint.parser, "get_html", side_effect=description.ParserError()) loader = invest_mint.InvestMintGateway() df = await loader("BELU") assert df is None
def _get_table_from_html(html: str, table_num: int) -> str: """Выбирает таблицу по номеру из html-страницы.""" soup = bs4.BeautifulSoup(html, "lxml") try: table = soup.find_all("table")[table_num] except IndexError: raise description.ParserError(f"На странице нет таблицы {table_num}") return f"<html>{table}</html>"
async def test_loader_web_error(mocker): """Регрессионный тест при ошибке загрузки данных из интернета.""" mocker.patch.object(parser, "get_df_from_url", side_effect=description.ParserError()) loader = close_reestry.CloseGateway() df = await loader("TATN") assert df is None
async def test_loader_get_df_from_html_error(mocker): """Регрессионный тест при парсинге данных.""" mocker.patch.object(invest_mint.parser, "get_html", return_value="") mocker.patch.object(invest_mint.parser, "get_df_from_html", side_effect=description.ParserError()) loader = invest_mint.InvestMintGateway() df = await loader("BELU") assert df is None
async def test_loader_web_error(mocker): """Регрессионный тест при ошибке загрузки данных из интернета.""" mocker.patch.object(parser, "get_df_from_url", side_effect=description.ParserError()) loader = street_insider.StreetInsider() df = await loader.__call__("BELU") assert df is None
def _validate_header(columns: pd.Index, cols_desc: Descriptions) -> None: """Проверяет, что заголовки соответствуют описанию.""" for desc in cols_desc: header = columns[desc.num] if not isinstance(header, tuple): header = [header] raw_name = desc.raw_name if all(part in name for part, name in zip(raw_name, header)): continue raise description.ParserError( f"Неверный заголовок: {desc.raw_name} не входит в {header}")
async def get_html( url: str, session: aiohttp.ClientSession = connections.HTTP_SESSION, ) -> str: """Загружает html-код страницы.""" async with session.get(url) as respond: try: respond.raise_for_status() except aiohttp.ClientResponseError: raise description.ParserError(f"Данные {url} не загружены") return await respond.text()
async def get_html( url: str, session: aiohttp.ClientSession = connections.HTTP_SESSION, ) -> str: """Загружает html-код страницы.""" ssl_context = ssl.create_default_context(cafile=certifi.where()) async with session.get(url, ssl_context=ssl_context) as respond: try: respond.raise_for_status() except aiohttp.ClientResponseError: raise description.ParserError(f"Данные {url} не загружены") return await respond.text()