Manejo de errores en Python con JSON y un diccionario

Actualmente tengo un script de Python 2.7 que raspa Facebook y captura algunos datos JSON de cada página. Los datos de JSON contienen información personal. A continuación se muestra una muestra de los datos JSON:

{ "id": "4", "name": "Mark Zuckerberg", "first_name": "Mark", "last_name": "Zuckerberg", "link": "http://www.facebook.com/zuck", "username": "zuck", "gender": "male", "locale": "en_US" } 

Los valores JSON pueden variar de una página a otra. El ejemplo anterior enumera todos los posibles pero a veces, un valor como ‘nombre de usuario’ puede no existir y puedo encontrar datos JSON como:

 { "id": "6", "name": "Billy Smith", "first_name": "Billy", "last_name": "Smith", "gender": "male", "locale": "en_US" } 

Con estos datos, quiero rellenar una tabla de base de datos. Como tal, mi código es el siguiente:

 results_json = simplejson.loads(scraperwiki.scrape(profile_url)) for result in results_json: profile = dict() try: profile['id'] = int(results_json['id']) except: profile['id'] = "" try: profile['name'] = results_json['name'] except: profile['name'] = "" try: profile['first_name'] = results_json['first_name'] except: profile['first_name'] = "" try: profile['last_name'] = results_json['last_name'] except: profile['last_name'] = "" try: profile['link'] = results_json['link'] except: profile['link'] = "" try: profile['username'] = results_json['username'] except: profile['username'] = "" try: profile['gender'] = results_json['gender'] except: profile['gender'] = "" try: profile['locale'] = results_json['locale'] except: profile['locale'] = "" 

La razón por la que tengo tantos bashs / excepciones es para tener en cuenta cuando el valor clave no existe en la página web. No obstante, esta parece ser una manera realmente complicada de manejar este problema.

Si elimino estas cláusulas de prueba / excepción, si mi raspador encuentra una clave faltante, devuelve un KeyError como "KeyError: 'username'" y mi script deja de ejecutarse.

Cualquier sugerencia sobre una forma mucho más inteligente y mejorada de manejar estos errores para que, si se encuentra una clave faltante, el script continúe.

He intentado crear una lista de los valores de JSON y busco iterarlos con una cláusula IF, pero no puedo entenderlo.

Utilice el método .get() lugar:

 >>> a = {'bar': 'eggs'} >>> a['foo'] Traceback (most recent call last): File "", line 1, in  KeyError: 'foo' >>> a.get('foo', 'default value') 'default value' >>> a.get('bar', 'default value') 'eggs' 

El método .get() devuelve el valor de la clave solicitada o el valor predeterminado si falta la clave.

O puede crear un nuevo dict con cadenas vacías para cada clave y usar .update() en él:

 profile = dict.fromkeys('id name first_name last_name link username gender locale'.split(), '') profile.update(result) 

dict.fromkeys() crea un diccionario con todas las claves que solicita configuradas a un valor predeterminado dado ( '' en el ejemplo anterior), luego usamos .update() para copiar todas las claves y valores del diccionario de result , reemplazando cualquier cosa que ya .update() allí .