'NoneType' 尝试遍历 GA API 结果时对象不可迭代
'NoneType' object is not iterable when trying to loop over GA API result
我的最终目标是将同一帐户内多个 属性 的前 500 个页面导出为 csv。我有 8 属性 所以我最后想要 8 个 csv。
在开始之前,我希望能够为每个 属性.
构建包含 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
变量的结果(?)并添加到每个 urls 页面的新数组:
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
这是全部代码:
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)
我希望我的目标很明确。感谢您的帮助!
对于您 运行 的至少一个值,您作为 test
加载的数据没有 rows
键。当您为该项目调用 test.get('rows')
时,它会 returns None
(因为您没有给它一个不同的默认值)。当您尝试遍历行时,这会导致异常。
您可以使用 test.get('rows', [])
避免异常(就像您在上面对 profiles
中的 items
所做的那样)。您还可以通过使用 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
。
我的最终目标是将同一帐户内多个 属性 的前 500 个页面导出为 csv。我有 8 属性 所以我最后想要 8 个 csv。
在开始之前,我希望能够为每个 属性.
构建包含 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
变量的结果(?)并添加到每个 urls 页面的新数组:
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
这是全部代码:
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)
我希望我的目标很明确。感谢您的帮助!
对于您 运行 的至少一个值,您作为 test
加载的数据没有 rows
键。当您为该项目调用 test.get('rows')
时,它会 returns None
(因为您没有给它一个不同的默认值)。当您尝试遍历行时,这会导致异常。
您可以使用 test.get('rows', [])
避免异常(就像您在上面对 profiles
中的 items
所做的那样)。您还可以通过使用 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
。