Youtube API Python и MySQL. Ошибка типа: строковые индексы должны быть целыми числами. Как исправить?

#python #mysql #youtube-api

#python #mysql #youtube-api

Вопрос:

итак, я делаю проект для API Youtube и мне нужно искать фильмы. Он подключен к моей базе данных MySQL, которая называется moviereviews . У меня есть таблица с именем films внутри и внутри этой таблицы есть столбцы, такие как «заголовок» или «описание» и т. Д., Которые вы увидите в моем коде. Мне нужно запустить мой код Python, чтобы записи, которые у меня есть, были вставлены в мою базу данных MySQL. Я получаю ошибку string indexes, поэтому мне нужна помощь в ее исправлении. В настоящее время я могу запустить только один фильм, но для моего проекта мне нужно запустить 3. Я также не знаю, верна ли остальная часть моего кода после текущей ошибки, которая у меня есть. Извлек мой ключ api. Надеюсь, я смогу получить некоторую помощь, спасибо.

 import mysql.connector
from googleapiclient.discovery import build


api_key = ''
youtube = build('youtube', 'v3', developerKey=api_key)

moviereview = youtube.search().list(q="Tenet - Movie Review", part="id,snippet", type='video', maxResults=0, pageToken=None)
response = moviereview.execute()


mydb = mysql.connector.connect(host='localhost',
                               user='kkkoenn',
                               password='onnnnnoo',
                               database = "moviereview"
                               )
mycursor = mydb.cursor()

for movie in response:
    title = movie['title']       #"this is where I am getting the error"
    description = movie['description']
    frame = movie['thumbnails']
    releaseDate = movie['publishDate']
    channel = movie['channelTitle']

    sql = "INSERT INTO films (Title, Description, Frame, ReleaseDate, Channel) VALUES (%s, %s, %s, %s, %s)"
    val = (title, description, frame, releaseDate, channel)
    mycursor.execute(sql, val)

    mydb.commit()


print("records inserted")
  

Комментарии:

1. Проверьте, что movie содержит. Возможно, вы получаете массив массив объектов.

Ответ №1:

Здесь ответом является словарь. Итак, сначала вам нужно получить элементы, используя response ['items'] . И тогда вы можете сначала распечатать каждый элемент и проверить свойства самого элемента.

Лучше всего использовать .get метод для доступа к любому объекту со значением по умолчанию, чтобы не получить никаких ошибок включения. Пример: response.get('items', [])

 movies = response.get('items', [])
for movie in movies:
    print(movie)
    print(type(movie))
    title = movie['title']  # or equivalent movie.get('title', None) would work
    description = movie['description']
    frame = movie['thumbnails']
    releaseDate = movie['publishDate']
    channel = movie['channelTitle']
    
  

Комментарии:

1. Итак, если бы я сделал response.get(‘items’, []), должен ли я иметь каждый объект, такой как заголовок, описание и т. Д. По отдельности? Например, response.get(‘items’, [title]) ? А также, я должен сделать response.get перед циклом for правильным? @VaibhavPatel

2. Обновлен ответ.

3. Поэтому, когда я использовал title = movie[‘title’] Я получил сообщение об ошибке KeyError: ‘title’. Однако, когда я попробовал movie.get(‘title’, None), я получил сообщение об ошибке TypeError: объект ‘builtin_function_or_method’ не подлежит подписке. Не уверен, что это значит. @VaibhavPatel

4. Можете ли вы напечатать, что содержит объект movie, и добавили ли вы movies = response.get('items', []) строку?

5. Я напечатал (фильм) и получил вывод фильма «принцип», который я установил в своем списке поиска. И да, movies = response.get(‘items’, []) был включен при запуске кода. @VaibhavPatel