web-dev-qa-db-ja.com

TypeError:asyncio.Future、コルーチン、またはawaitableが必要です

Beautifulsoupとaiohttpを使用して非同期Webスクレイパーを作成しようとしています。これは、物事を開始するための最初のコードです。[TypeError:Asyncio.Future、コルーチンまたは待機可能オブジェクトが必要です]を取得し、苦労しています私のコードの何が問題なのかを理解しています。pythonは初めてです。

import bs4
import asyncio
import aiohttp


async def parse(page):
    soup=bs4.BeautifulSoup(page,'html.parser')
    soup.prettify()
    print(soup.title)



async def request():
    async with aiohttp.ClientSession() as session:
        async with session.get("https://google.com") as resp:
            await parse(resp)



loop=asyncio.get_event_loop()
loop.run_until_complete(request)

トレースバック:-

Traceback (most recent call last):
  File "C:\Users\User\Desktop\Bot\aio-req\parser.py", line 21, in <module>
    loop.run_until_complete(request)
  File "C:\Users\User\AppData\Local\Programs\Python\Python38-32\lib\asyncio\base_events.py", line 591, in run_until_complete
    future = tasks.ensure_future(future, loop=self)
  File "C:\Users\User\AppData\Local\Programs\Python\Python38-32\lib\asyncio\tasks.py", line 673, in ensure_future
    raise TypeError('An asyncio.Future, a coroutine or an awaitable is '
TypeError: An asyncio.Future, a coroutine or an awaitable is required
2
user7657046

1つの問題は、loop.run_until_complete(request)loop.run_until_complete(request())であることです-コルーチンを返すには、実際に呼び出す必要があります。

さらに問題があります-_aiohttp.ClientResponse_オブジェクトをparseに渡して、text/htmlとして処理するような場合です。私は以下で動作するようにしましたが、parseがコルーチンではなくなったため、ニーズに合うかどうかはわかりません。

_def parse(page):
    soup=bs4.BeautifulSoup(page,'html.parser')
    soup.prettify()
    return soup.title

async def fetch(session, url):
    async with session.get(url) as response:
        return await response.text()

async def request():
    async with aiohttp.ClientSession() as session:
        html = await fetch(session, "https://google.com")
        print(parse(html))

if __name__ == '__main__':
    loop=asyncio.get_event_loop()
    loop.run_until_complete(request())
_

これも機能します:

_def parse(page):
    soup=bs4.BeautifulSoup(page,'html.parser')
    soup.prettify()
    print(soup.title)

async def request():
    async with aiohttp.ClientSession() as session:
        async with session.get("https://google.com") as resp:
            parse(await resp.text())
_

そして最後に、元のコード。待機可能な応答オブジェクトをparseに渡し、page.text()を待機します。

_async def parse(page):
    soup=bs4.BeautifulSoup(await page.text(),'html.parser')
    soup.prettify()
    print(soup.title)

async def request():
    async with aiohttp.ClientSession() as session:
        async with session.get("https://google.com") as resp:
            await parse(resp)
_
4
wwii

私はコードをこれに変更しましたが、現在は機能しています。

import bs4
import asyncio
import aiohttp


async def parse(page):
    soup=bs4.BeautifulSoup(page,'html.parser')
    soup.prettify()
    print(soup.title)



async def request():
    async with aiohttp.ClientSession() as session:
        async with session.get("https://google.com") as resp:
            html=await resp.text()
            await parse(html)



loop=asyncio.get_event_loop()
loop.run_until_complete(request())
1
user7657046