Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python '的键错误;片段';使用YouTube API RelatedToVideoID功能时_Python_For Loop_Youtube Api_Append_Keyerror - Fatal编程技术网

Python '的键错误;片段';使用YouTube API RelatedToVideoID功能时

Python '的键错误;片段';使用YouTube API RelatedToVideoID功能时,python,for-loop,youtube-api,append,keyerror,Python,For Loop,Youtube Api,Append,Keyerror,这是我有史以来第一个关于堆栈溢出的问题,所以如果有任何不清楚的地方,请告诉我。:) 我的问题有点与你有关。我正在尝试使用YouTube API为我的论文采集视频样本。我用下面的代码成功地做到了这一点;但是,当我将条件从查询(q)更改为relatedToVideoId时,解包部分由于某种原因中断。。它在我的循环外工作,但在循环内不工作(来自另一个线程的.get()建议也是如此)。有人知道为什么会这样吗?我如何解决 这是我编写的(缩短的)代码,您可以使用它来复制问题: import numpy as

这是我有史以来第一个关于堆栈溢出的问题,所以如果有任何不清楚的地方,请告诉我。:)

我的问题有点与你有关。我正在尝试使用YouTube API为我的论文采集视频样本。我用下面的代码成功地做到了这一点;但是,当我将条件从查询(q)更改为relatedToVideoId时,解包部分由于某种原因中断。。它在我的循环外工作,但在循环内不工作(来自另一个线程的.get()建议也是如此)。有人知道为什么会这样吗?我如何解决

这是我编写的(缩短的)代码,您可以使用它来复制问题:

import numpy as np
import pandas as pd

# Allocate credentials:
from googleapiclient.discovery import build
api_key = "YOUR KEY SHOULD GO HERE"
# Session Build
youtube = build('youtube', 'v3', developerKey = api_key)

df_sample_v2  = pd.DataFrame(columns = ["Video.ID", "Title", "Channel Name"])    
keywords       = ['Global Warming',
                  'Coronavirus'
                  ]
iter           = list(range(1, 150))
rand_selec_ids = ['H6u0VBqNBQ8',
                 'LEZCxxKp0hM'
                 ]
for i in iter:
        
      # Search Request
      request = youtube.search().list(
          part             = "snippet",
          #q               = keywords[4],
          relatedToVideoId = rand_selec_ids[1],
          type             = "video",
          maxResults       = 5000,
          videoCategoryId  = 28,
          order            = "relevance",
          eventType        = "completed",
          videoDuration    = "medium"
      ) 

      # Save Response
      response = request.execute()

      # Unpack Response
      rows = []

      for i in list(range(0, response['pageInfo']['resultsPerPage'])):

          rows.append([response['items'][i]['id']['videoId'],
                       response['items'][i]['snippet']['title'], # this is the problematic line
                       response['items'][i]['snippet']['channelTitle']]
                     )

      temp = pd.DataFrame(rows, columns = ["Video.ID", "Title", "Channel Name"])
      df_sample_v2 = df_sample_v2.append(temp)
      print(f'{len(df_sample_v2)} videos retrieved!')
我得到的KeyError位于rows.append()的第二行,在那里我尝试访问代码段

KeyError                                  Traceback (most recent call last)
<ipython-input-90-c6c01139e372> in <module>
     45 
     46                 rows.append([response['items'][i]['id']['videoId'],
---> 47                              response['items'][i]['snippet']['title'],
     48                              response['items'][i]['snippet']['channelTitle']]
     49                            )

KeyError: 'snippet'
keyrerror回溯(最近一次调用)
在里面
45
46行。追加([response['items'][i]['id']['videoId'],
--->47响应['items'][i]['snippet']['title'],
48响应['items'][i]['snippet']['channelTitle']]
49                            )
KeyError:“代码段”

您的问题源于以下事实:数组
项的大小的属性
resultsPerPage

迭代从API获得的项的正确方法如下(这也是进行此类迭代的一般python方法):

对于响应中的项['items']:
行。追加([
项目['id']['videoId'],
项目['snippet']['title'],
项目['snippet']['channelTitle']
])
您可以在代码中添加类似下面的调试代码,以使自己相信我的说法

print(f“resultsPerPage={response['pageInfo']['resultsPerPage']}”)
打印(f“len(items)={len(response['items]]))

请提供完整的回溯对不起!我添加了问题的回溯。
'snippet'
在item:
response['item'][I]
之后不存在:
response['snippet']
您确定它不应该是类似于
response['item'][I].key()的东西吗?可能首先在
response['item'][I]中使用
.key()
查看您获得了哪些密钥-或者在尝试获取密钥之前,检查响应['item'][i]中的'snippet'是否为
。可能服务器没有发送此信息。对于响应中的项目['items']:行。追加([item['id']['videoId'],…])
非常感谢!这确实是我遇到的问题的根源:)了不起的工作!