Python中使用JSON和字典的错误处理

4 投票
1 回答
4765 浏览
提问于 2025-04-17 16:40

我现在有一个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"
}

这些JSON值在不同的页面上可能会有所不同。上面的例子列出了所有可能的值,但有时候像'username'这样的值可能不存在,我可能会遇到这样的JSON数据:

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

有了这些数据,我想把它们填入一个数据库表格。所以,我的代码如下:

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'] = ""

我之所以有这么多的try/except语句,是为了处理网页上可能不存在的键值。不过,这样的处理方式看起来真的很笨拙,也很乱。

如果我去掉这些try/except语句,当我的抓取程序遇到缺失的键时,就会返回一个KeyError,比如"KeyError: 'username'",这时我的脚本就会停止运行。

有没有更聪明、更好的方法来处理这些错误,这样如果遇到缺失的键,脚本还能继续运行呢?

我尝试过创建一个JSON值的列表,并想用IF语句来遍历它们,但我就是搞不定。

1 个回答

10

可以使用.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'

.get()方法会返回你请求的键对应的值,如果这个键不存在,就返回一个默认值。

或者你可以创建一个新的字典,给每个键设置为空字符串,然后使用.update()方法:

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

dict.fromkeys()可以创建一个字典,里面的所有键都设置为你指定的默认值(在上面的例子中是''),然后我们用.update()result字典里的所有键和值复制过来,替换掉已经存在的内容。

撰写回答