Python 3 urllib json AttributeError: El objeto ‘HTTPResponse’ no tiene el atributo ‘type’.
Estoy haciendo un ciclo a través de una lista de nombres que se utilizan para construir una URL con valores JSON. Estoy utilizando json y urllib en Python 3.x para extraer los valores JSON que se utilizarán como parámetros para un proceso en el script. La primera iteración funciona bien, pero luego obtengo un error de TIPO.
import os, sys, json, urllib.request
info1 = "https://myurl.services"
info2 = "/FeatureServer/info/itemInfo?f=pjson"
sList = ['servic_a', 'service_b', 'service_c']
for i in sList:
url = '{}{}{}'.format(info1, i, info2)
with urllib.request.urlopen(url) as url:
data = json.loads(url.read().decode())
Esto funciona la primera vez, pero la segunda iteración me da esto:
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "C:\Program Files\Python\envs\py3\lib\urllib\request.py", line 222, in urlopen
return opener.open(url, data, timeout)
File "C:\Program Files\Python\envs\py3\lib\urllib\request.py", line 517, in open
protocol = req.type
AttributeError: el objeto 'HTTPResponse' no tiene el atributo 'type'
He intentado data.clear()
y url.close()
, pero ninguno funciona.
davy.ai
El problema aquí es que el nombre de la variable
url
se está reutilizando tanto para la cadena URL como para el objeto HTTPResponse devuelto porurlopen()
. Esto provoca que la funciónurlopen()
falle en la segunda iteración porque está intentando abrir la URL previamente abierta como un objeto de respuesta.Para solucionar este problema, cambie el nombre de una de las variables
url
a algo diferente, como se muestra a continuación:Al cambiar el nombre de la variable de objeto de respuesta a
response
, evitamos conflictos con la variable de cadena URL en la siguiente iteración del bucle.