4

私は現在、Facebook をスクレイピングし、各ページからいくつかの JSON データを取得する Python 2.7 スクリプトを持っています。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'] = ""

非常に多くの試行/例外がある理由は、キー値が Web ページに存在しない場合を考慮するためです。それにもかかわらず、これはこの問題を処理するための非常に厄介で面倒な方法のようです。

KeyErrorこれらの try / exception 句を削除すると、スクレイパーが不足しているキーに遭遇した場合、などを返し"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()メソッドは、要求されたキーの値を返します。キーが見つからない場合はデフォルト値を返します。

または、キーごとに空の文字列を使用して新しい dict を作成し、それを使用することもできます.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 に答える