'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