es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , ,

Answer

  1. Avatar for 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 por urlopen(). Esto provoca que la función urlopen() 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:

    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 response:
            data = json.loads(response.read().decode())
    

    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.

Comments are closed.