Как получить строку из асинхронной функции при помощи return
Пытаюсь разобраться в асинхронности, вся функция работает, но выводит
({<Task finished name='Task-3' coro=<call_url() done, defined at Путь до папки\test.py:7> result='[email protected]'>, <Task finished name='Task-2' coro=<call_url() done, defined at Путь до папки\test.py:7> result='[email protected]'>}, set()
Как сделать более чистый вывод и получить только результуат? Сразу скажу, что похожий вопрос мне не помог.
import asyncio
import aiohttp
from bs4 import BeautifulSoup
urls = ['https://e-ecolog.ru/entity/2360009926','https://e-ecolog.ru/entity/2360009926']
async def call_url(url):
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
data = await response.text()
soup = BeautifulSoup(data, 'html.parser')
mail = soup.find(itemprop="email")
return mail.string
futures = [call_url(url) for url in urls]
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(futures))
Ответы (1 шт):
Автор решения: CrazyElf
→ Ссылка
Вроде так можно результаты получить:
results = [task.result() for task in futures]
Только наверное wait нужно на gather поменять, чтобы сделать ожидание всем задачам. Только звёздочку не забудьте тут:
loop.run_until_complete(asyncio.gather(*futures))
И вызовы тоже поменять, спасибо andreymal:
futures = [loop.create_task(call_url(url)) for url in urls]
Ну, я пока в asyncio и сам ещё не совсем разбираюсь.