4

我目前有一个 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 值可能因页面而异。上面的示例列出了所有可能的情况,但有时,“用户名”之类的值可能不存在,我可能会遇到 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/exception 子句,如果我的刮刀遇到丢失的键,它会返回一个KeyError例如"KeyError: 'username'"并且我的脚本停止运行。

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

我尝试创建一个 JSON 值列表,并希望使用 IF 子句遍历它们,但我就是想不通。

4

1 回答 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字典中复制所有键和值,替换已经存在的任何内容。

于 2013-02-21T18:16:48.190 回答