cards = trees() #ФУНКЦИЯ ПАРСИНГА
Ну вот тут уже проблема. Ты в асинхронном боте делаешь длительный синхронный вызов.
Перепиши свой парсер на асинхронный код, запусти его через
asyncio.create_task() и сохрани полученный объект задачи в глобальную переменную (если у тебя может быть не более одного активного парсера).
Для отмены проверь, что в глобальной переменной лежит не None, а искомый объект. Если так, то вызови у него метод
cancel().
Это спровоцирует исключение CancelledError в функции парсера, что позволит прервать её выполнение, но в то же время аккуратно отработать освобождению ресурсов и т.п.