How to fix - TypeError: object StreamReader can't be used in 'await' expression

How to fix - TypeError: object StreamReader can't be used in 'await' expression

我正在使用 python(3.8.8) aiohttp 和 asyncio 来发出异步 http 请求。 但是,当我尝试等待 resp.content 的呼叫时,我收到了 TypeError:对象 StreamReader 不能用于 'await' 表达式

Traceback (most recent call last):
  File "test_aiohttp.py", line 34, in get_country_wrapper
    country_lst = await asyncio.gather(*result)
  File "test_aiohttp.py", line 17, in get_country
    html_text = await resp.content
TypeError: object StreamReader can't be used in 'await' expression

但是当我尝试等待对 resp.json() 的调用时,它起作用了。

async def get_country(session, url):
    '''
        Return the country of a given kaggle user
    '''    
    async with session.get(url) as resp:
        # json_resp = await resp.json()
        html_text = await resp.content
        country = re.search(r',"country":"([\w ]+)"', html_text)
        return str(country.group(1))



async def get_country_wrapper(usernames):

    try:
        async with aiohttp.ClientSession() as session:
            
            base_url = 'https://www.kaggle.com/'
            result = []
            for username in usernames:
                url = base_url+str(username)
                result.append(asyncio.create_task(get_country(session, url)))

            country_lst = await asyncio.gather(*result)
            return country_lst

    except Exception as e:
        print("Error: ", traceback.format_exc())


# Below is a sample list of users.
# Actual requirement is to run below for about 10,000 or more users
user_list = ['jhovey1', 'jsheppard95', 'dudihgustian', 'khmx5200', 'skshivamkedia']
asyncio.run(get_country_wrapper(user_list[:5]))

为什么我不能像 resp.json() 一样在这里使用 resp.content?

(我使用 resp.content 而不是 resp.json() 的原因是后者给出了这个特定 url 的错误)

我参考了以下文章,其中 resp.json() 的用法在上面描述过。

https://www.twilio.com/blog/asynchronous-http-requests-in-python-with-aiohttp

https://itqna.net/questions/76711/error-requests-aiohttp-asyncio

ClientResponse.json 是一个尝试将响应数据解析为 JSON 和 returns 字典的协程。 ClientResponse.contentStreamReader对象用户读取响应数据。这两者不可互换。您可能希望 ClientResponse.text 其中 returns 响应数据为字符串或 ClientResponse.bytes 其中 returns 响应数据为一个字节。

html_text = await resp.text()