Задать вопрос

Как ловить статус и от этого выводить результат?

Всем привет, еще учусь, так что не судите строго )
Сделал парсинг на питоке, который определяет в див блоке текст и по нему выводит результат.
Результаты показывает в консоле и в боте, я хочу в боте показывать только те результаты, где стоит (Можно).
А так же я записываю в текстовый документ, где стоит (Можно).

Функция парсинга
async def check_text(text):
    url = f'https://сайт.com/?query={text}'

    async with aiohttp.ClientSession() as session:
        async with session.get(url) as response:
            if response.status == 200:
                html = await response.text()
                soup = BeautifulSoup(html, 'html.parser')
                status_element = soup.find('div', class_='table-block')

                if status_element:
                    status_text = status_element.get_text().strip()

                    if "ok" in status_text:
                        return f'{text} \n Можно.'
                    elif "no" in status_text:
                        return f'{text} \n Данный вариант недоступен.'
                    elif "no1" in status_text:
                        return f'{text} \n Данный вариант недоступен, можно под заказ.'
                    else:
                        return f'{text} \n Недоступен.'
                else:
                    return f'Не удалось определить результат {text}.'

    return None


Функция обработки
for text in texts_to_check:
            try:

<b>#как теперь тут ниже, определить какой статус я получаю, чтобы от этого плясать, показывать только в консоле или же отправлять в бота.</b>

                if await check_text(text):
                     result = await check_text(text)
                     logger.info(f'{result}') #показываем результат в консоле
                else:
                     resultFree = await check_text(text)
                     logger.info(f'{text}: {resultFree}') #отправляем результат в бота

                if resultFree is not None:  #отправляем результат на запись в файл
                    if not is_already_recorded(text):  
                        with open(get_free_filename(current_filename), 'a') as free_file:
                            free_file.write(text + '\n')
                        await send_notification(ADMIN_CHAT_ID, resultFree) 

                delay = random.randint(100, 200)
                await asyncio.sleep(delay)


Я сделал проверку, чтобы от нее и плясать, смотря какой результат статуса я получаю для проверки, но не понял, как мне передать результат, как проверять, если (Можно), то срабатывает тот вариант где отправить боту, если нельзя, то просто в консоле показывает.

if await check_text(text):
                     result = await check_text(text)
                     logger.info(f'{result}') #показываем результат в консоле
                else:
                     resultFree = await check_text(text)
                     logger.info(f'{text}: {resultFree}') #отправляем результат в бота


Вот как тут if await check_text(text):, сделать проверку полученного при парсинге статуса?
  • Вопрос задан
  • 218 просмотров
Подписаться 2 Простой 9 комментариев
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
Вместо строки возвращай кортеж или словарь. Короче, структуру данных.
from typing import NamedTuple

class Result(NamedTuple):
    text: str  # текст запроса
    success: bool  # успешен ли запрос
    status: str  # статус

async def check_text(text: str) -> Result:
    url = f'https://сайт.com/?query={text}'

    async with aiohttp.ClientSession() as session:
        async with session.get(url) as response:
            if response.status != 200:
                return Result(text=text, success=False, status='Не удалось определить результат')
            html = await response.text()
            soup = BeautifulSoup(html, 'html.parser')
            status_element = soup.find('div', class_='table-block')
            if not status_element:
                return Result(text=text, success=False, status='Не удалось определить результат')
            status_text = status_element.get_text().strip()
            # тебе нужно будет решить, когда запрос был успешен (True), а когда нет (False)
            if "ok" in status_text:
                return Result(text=text, success=True, status='Можно')
            elif "no" in status_text:
                return Result(text=text, success=False, status='Данный вариант недоступен')
            elif "no1" in status_text:
                return Result(text=text, success=True, status='Можно под заказ')
            else:
                return Result(text=text, success=False, status='Неизвестно')

Тогда можно будет анализировать результат просто:
result = await check_text(text)
if result.success:
    ...  # реагируем на успешный запрос
    logger.info('%s: %s', result.text, result.status)
else:
    ...  # реагируем на неудачный запрос
    logger.info('%s: %s', result.text, result.status)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы