Python中使用JSON和字典的错误处理
我现在有一个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
字典里的所有键和值复制过来,替换掉已经存在的内容。