python Объект aiohttp Client Responses для io.Text IO Wrapper - PullRequest
0 голосов
/ 08 мая 2020

Я наткнулся на проблему с моим кодом, я хочу использовать библиотеку, чтобы открывать содержимое веб-страницы и просматривать его c определенным образом, после просмотра исходного кода этой библиотеки я понял что для использования этой библиотеки мне нужно было использовать объект _io.TextIOWrapper, а не объект aiohttp, поэтому мне было интересно, есть ли способ преобразовать и его. Вот несколько примеров

>>> open('./NEWS.txt')
<_io.TextIOWrapper name='./NEWS.txt' mode='r' encoding='cp1252'>
>>> import aiohttp
>>> import asyncio
>>> async def fetch(session, url):
...     async with session.get(url) as response:
...         return response
...
>>> async def main():
...     async with aiohttp.ClientSession() as session:
...         html = await fetch(session, 'http://python.org')
...         print(html)
...
>>> if __name__ == '__main__':
...     loop = asyncio.get_event_loop()
...     loop.run_until_complete(main())
...
<ClientResponse(https://www.python.org/) [200 OK]>
<CIMultiDictProxy('Server': 'nginx', 'Content-Type': 'text/html; charset=utf-8', 'X-Frame-Options': 'DENY', 'Via': '1.1 vegur', 'Via': '1.1 varnish', 'Content-Length': '49058', 'Accept-Ranges': 'bytes', 'Date': 'Fri, 08 May 2020 14:20:23 GMT', 'Via': '1.1 varnish', 'Age': '1960', 'Connection': 'keep-alive', 'X-Served-By': 'cache-bwi5137-BWI, cache-pao17432-PAO', 'X-Cache': 'HIT, HIT', 'X-Cache-Hits': '2, 2', 'X-Timer': 'S1588947623.222259,VS0,VE0', 'Vary': 'Cookie', 'Strict-Transport-Security': 'max-age=63072000; includeSubDomains')>

>>>


Есть мысли? Пожалуйста, дайте мне знать

1 Ответ

1 голос
/ 08 мая 2020

TextIOWrapper принимает буфер в качестве первого аргумента. Поскольку ваш ответ представляет собой просто строку, вы можете преобразовать строку в буферизованный модуль чтения и передать ее в TextIOWrapper.

import io
html = await response.text()
buffer = io.BufferedReader(io.BytesIO(html.encode("utf-8")))
textWrapper = io.TextIOWrapper(buffer)
print(textWrapper.read())

Теперь может быть лучший способ. aiohttp предлагает вам декодировать ответ напрямую в байты. Если бы вы могли использовать это каким-то образом, это было бы более эффективно, поскольку вам не нужно преобразовывать в текст между ними.

async with session.get('https://api.github.com/events') as resp:
    await resp.content.read()

Здесь проверьте документацию по этому поводу.

...