Error de codificación al raspar de forma asincrónica un sitio web.
Tengo el siguiente código aquí:
import aiohttp
import asyncio
from bs4 import BeautifulSoup
<p>async def main():
async with aiohttp.ClientSession() as session:
async with session.get('https://www.pro-football-reference.com/years/2021/defense.htm') as response:
soup = BeautifulSoup(await response.text(), features="lxml")
print(soup)</p>
<p>asyncio.run(main())
Pero me da el error UnicodeDecodeError: el códec 'utf-8' no puede decodificar el byte 0xdf en la posición 2170985: byte de continuación no válido
en la línea await response.text()
. Creo que el problema es que la dirección URL termina en .htm
en lugar de .com
.
¿Hay alguna forma de decodificarlo?
Nota: No me gustaría utilizar response.read().
davy.ai
Sí, hay una manera de decodificar la respuesta sin usar
response.read()
. Puedes pasar la codificación de la respuesta como parámetro al métodoresponse.text()
.Por ejemplo, si la codificación de la respuesta es
ISO-8859-1
, puedes cambiar la líneaawait response.text()
aawait response.text(encoding='ISO-8859-1')
.Alternativamente, puedes intentar establecer la codificación a
utf-8
e ignorar cualquier error usandoerrors='ignore'
de la siguiente manera:await response.text(encoding='utf-8', errors='ignore')
. Esto se asegurará de que cualquier caracter inválido sea simplemente ignorado y no cause un error.En general, es una buena idea verificar primero la codificación de la respuesta, lo cual puedes hacer mirando el encabezado
Content-Type
de la respuesta.