2017-02-09 7 views
0

私の最終的な目標は、同じアカウント内の複数のプロパティから上位500ページをCSV形式でエクスポートすることです。私は8つのプロパティを持っているので、最後に8つのCSVが必要です。GA APIの結果をループしようとすると 'NoneType'オブジェクトが反復できません

これまでは、各プロパティの500ページのURLを含む複数のリストを作成できるようにしたいと考えています。

私はPythonには新しいので、スクリプトを段階的に作成しています。

まず私は、プロファイルIDのリストを構築しています:

profiles = service.management().profiles().list(
     accountId='XXXXX', 
     webPropertyId='UA-XXXXXXX-XX').execute() 

    for profile in profiles.get('items', []): 
    list.append(profile.get('id')) 

第二に、私は、各プロファイルのトップ500ページを取得するために、このリストを反復処理しています:

for item in list: 
    test = service.data().ga().get(
     ids='ga:' + item, 
     start_date='1daysAgo', 
     end_date='today', 
     metrics='ga:sessions', 
     dimensions='ga:pagePath', 
     sort='-ga:sessions', 
     filters='ga:sessions>500').execute() 

第三(これを状況が複雑になる)test変数(?)の結果をループし、各URLページに新しい配列を追加する:

for row in test.get('rows'): 
    rawdata.append(row) 

私は次のエラーを持っているこの段階でスクリプトを実行:私は私の目標が明確であると思います

profiles = service.management().profiles().list(
     accountId='5140486', 
     webPropertyId='UA-5140486-16').execute() 

    for profile in profiles.get('items', []): 
    list.append(profile.get('id')) 

    for item in list: 
    test = service.data().ga().get(
     ids='ga:' + item, 
     start_date='1daysAgo', 
     end_date='today', 
     metrics='ga:sessions', 
     dimensions='ga:pagePath', 
     sort='-ga:sessions', 
     filters='ga:sessions>500').execute() 

    for row in test.get('rows'): 
     rawdata.append(row) 

:ここ

File "test.py", line 71, in get_first_profile_id 
    for row in test.get('rows'): 
TypeError: 'NoneType' object is not iterable 

は、すべてのコードです。助けてくれてありがとう!

+1

test ['rows']が存在しますか?そうでなければ、最後のfor-loopの前に 'if '行を' test'で追加し、インデントをチェックしてください。 – andpei

+1

'profiles.get( 'items'、[])'の前のループのように 'test.get( 'rows'、[])'を使用してください。また、 'append'呼び出しを束縛するのではなく、' list.extend'メソッドを使うことも意味があります。 (また、 'list'という名前の変数を持つことは非常に悪い考えです。) – Blckknght

+0

@Blckknght' test.get( 'rows'、[]) 'と一緒に働いています。あなたはこれについて適切な答えを書くことができますか?なぜか分からない。変数 'list'の名前を変更しました。あなたはまったく正しいです。ありがとう!また、 'list.extend'のおかげでもう一度教えてください! –

答えて

1

実行中の値のうち少なくとも1つで、testとしてロードするデータにはrowsというキーがありません。その項目にtest.get('rows')を呼び出すと、Noneが返されます(別のデフォルト値を指定していないため)。これは、行を反復しようとすると例外が発生します。

test.get('rows', [])を使用して例外を回避することができます(itemsからprofiles)。またlist.extendを使用しての代わりに、ループして繰り返しappendを呼び出すことで、物事を少しを効率化することができます

profiles = service.management().profiles().list(
    accountId='XXXXX', 
    webPropertyId='UA-XXXXXXX-XX').execute() 

my_list.extend(profile.get('id') for profile in profiles.get('items', [])) # use extend 

for item in my_list: # it's a really bad idea to have a variable named list, so I renamed it 
    test = service.data().ga().get(
     ids='ga:' + item, 
     start_date='1daysAgo', 
     end_date='today', 
     metrics='ga:sessions', 
     dimensions='ga:pagePath', 
     sort='-ga:sessions', 
     filters='ga:sessions>500').execute() 

    rawdata.extend(test.get('rows', [])) # here too 

注これは黙って失われたデータを無視すること。欠落しているデータを持つことが普通のことであれば問題ありません。しかし、それが珍しい場合は、エラーとして扱いたいと思うかもしれません。簡単な方法は、test['rows']を使用し、問題を処理したい場合はいつでもKeyErrorをキャッチすることです。

関連する問題