Voy más de la parte de la URL y puede recuperar la mayor parte de los datos que puedo de una API que estoy usando. *Imgur API. Sin embargo, cuando se encuentra una imagen que ha sido publicado antes, pero fue finalmente eliminado todavía muestra un positivo URL obtener respuesta (código 200), y cuando uso

    j1 = json.loads(r_positive.text)

Me sale este error:

http://imgur.com/gallery/cJPSzbu.json
<Response [200]>
Traceback (most recent call last):
  File "image_poller_multiple.py", line 61, in <module>
    j1 = json.loads(r_positive.text)
  File "/usr/lib/python2.7/json/__init__.py", line 326, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python2.7/json/decoder.py", line 366, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/lib/python2.7/json/decoder.py", line 384, in raw_decode
    raise ValueError("No JSON object could be decoded")
ValueError: No JSON object could be decoded

¿Cómo puede «recuperar» el error dentro de la j1 de la variable de lugar? Me gustaría utilizar una estructura condicional para resolver el problema y evitar que mi programa de estrellarse. Algo así como

if j1 == ValueError:
  continue
else:
  do_next_procedures()
  • Su ejemplo de URL me da un 302 Found, redirigiendo me a imgur.com/cJPSzbu. Son usted seguro de que es 200 OK?
InformationsquelleAutor Arturo | 2013-04-08

2 Comentarios

  1. 6

    Necesita utilizar try except lugar:

    try:
        j1 = json.loads(r_positive.text)
    except ValueError:
        # decoding failed
        continue
    else:
        do_next_procedures()

    Ver El Manejo De Excepciones en el tutorial de Python.

    Lo realmente que pasa es que usted se redirige a la URL y tienes la página de la imagen en su lugar. Si usted está usando requests para ir a buscar el JSON, mira la respuesta de la historia lugar:

    if r_positive.history:
        # more than one request, we were redirected:
        continue
    else:
        j1 = r_positive.json()

    o incluso se podría no permitir redirecciones:

    r = requests.post(url, allow_redirects=False)
    if r.status == 200:
        j1 = r.json() 
    • Como siempre, @martijn, brillante asesoramiento, uno de los fundamentales de Python flujo de control estructuras. Por CIERTO, felicidades por los 100K!
    • Gran respuesta! gracias!
    • No continue ser pass (Python noop declaración) en su lugar? Un continue declaración fuera de un bucle es SyntaxError en Python 2.7 (una excepción de bloque de control no es un bucle).
    • El OP tiene un continue declaración, por lo que supuse que el fragmento publicado es parte de un gran bloque de código que se repite.
    • Oh, me acabo de dar cuenta de que estás en lo cierto. Sin embargo, creo que el uso de pass para el manejo de excepciones ejemplo sería más aplicable en general para los principiantes de Python. 😉
  2. 1

    La dirección URL que aparece redirige a una página HTML. (Uso curl para comprobar este tipo de cosas, que él es su amigo.)

    La página HTML, obviamente, no puede ser analizado como JSON.

    Probablemente lo que necesitas es este:

    response = fetch_the_url(url)
    if response.status == 200:
      try:
        j1 = json.loads(response.text)
      except ValueError:
        # json can't be parsed
        continue

Dejar respuesta

Please enter your comment!
Please enter your name here