使用JSON和字典在Python中进行错误处理

the*_*men 3 python json dictionary python-2.7

我目前有一个Python 2.7脚本,可以抓取Facebook并从每个页面捕获一些JSON数据.JSON数据包含个人信息.下面是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"
}
Run Code Online (Sandbox Code Playgroud)

JSON值可能因页面而异.以上示例列出了所有可能的内容,但有时候,"username"等值可能不存在,我可能会遇到JSON数据,例如: -

{
   "id": "6",
   "name": "Billy Smith",
   "first_name": "Billy",
   "last_name": "Smith",
   "gender": "male",
   "locale": "en_US"
}
Run Code Online (Sandbox Code Playgroud)

有了这些数据,我想填充一个数据库表.因此,我的代码如下: -

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'] = ""
Run Code Online (Sandbox Code Playgroud)

我有这么多尝试/例外的原因是考虑网页上不存在键值的时间.尽管如此,这似乎是解决这个问题的一种非常集中和混乱的方式.

如果我删除这些try/exception子句,如果我的刮刀遇到丢失的密钥,它会返回一个KeyError这样的,"KeyError: 'username'"并且我的脚本停止运行.

有关处理这些错误的更智能和更改进的方法的任何建议,以便在遇到丢失的密钥时,脚本继续.

我已经尝试创建一个JSON值列表,并期望使用IF子句迭代它们,但我无法弄明白.

Mar*_*ers 6

改用.get()方法:

>>> a = {'bar': 'eggs'}
>>> a['foo']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'foo'
>>> a.get('foo', 'default value')
'default value'
>>> a.get('bar', 'default value')
'eggs'
Run Code Online (Sandbox Code Playgroud)

.get()方法返回所请求键的值,如果缺少键,则返回默认值.

或者,您可以为每个键创建一个包含空字符串的新dict并.update()在其上使用:

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

dict.fromkeys()创建一个字典,将您请求的所有键设置为给定的默认值(''在上面的示例中),然后我们使用.update()result字典中复制所有键和值,替换已存在的任何键.