Python 3.7 KeyError - PullRequest
       6

Python 3.7 KeyError

0 голосов
/ 26 марта 2020

Мне нравится получать информацию из NewsApi и столкнулся с проблемой. Приложенный код:

from NewsApi import NewsApi
import pandas as pd
import os
import datetime as dt
from datetime import date


def CreateDF(JsonArray,columns):
    dfData = pd.DataFrame()

    for item in JsonArray:
        itemStruct = {}

        for cunColumn in columns:
            itemStruct[cunColumn] = item[cunColumn]

        # dfData = dfData.append(itemStruct,ignore_index=True)
            # dfData = dfData.append({'id': item['id'], 'name': item['name'], 'description': item['description']},
            #                        ignore_index=True)

    # return dfData
    return itemStruct

def main():
    # access_token_NewsAPI.txt must contain your personal access token
    with open("access_token_NewsAPI.txt", "r") as f:
        myKey = f.read()[:-1]
        #myKey = 'a847cee6cc254d8495632f83d5c77d39'

    api = NewsApi(myKey)

    # get sources of news
    # columns = ['id', 'name', 'description']
    # rst_source = api.GetSources()
    # df = CreateDF(rst_source['sources'], columns)
    # df.to_csv('source_list.csv')
    #
    #
    # # get news for specific country
    # rst_country = api.GetHeadlines()
    # columns = ['author', 'publishedAt', 'title', 'description','content', 'url']
    # df = CreateDF(rst_country['articles'], columns)
    # df.to_csv('Headlines_country.csv')

    # get  news for specific symbol
    symbol = "coronavirus"
    sources = 'bbc.co.uk'
    columns = ['author', 'publishedAt', 'title', 'description', 'content', 'source']
    limit = 500     # maximum requests per day
    i = 1
    startDate = dt.datetime(2020, 3, 1, 8)
    # startDate = dt.datetime(2020, 3, 1)
    df = pd.DataFrame({'author': [], 'publishedAt': [], 'title': [], 'description': [], 'content':[], 'source': []})
    while i < limit:
        endDate = startDate + dt.timedelta(hours=2)
        rst_symbol = api.GetEverything(symbol, 'en', startDate, endDate, sources)
        rst = CreateDF(rst_symbol['articles'], columns)
        df = df.append(rst, ignore_index=True)
        # DF.join(df.set_index('publishedAt'), on='publishedAt')
        startDate = endDate
        i += 1

    df.to_csv('Headlines_symbol.csv')

main()

Я получил следующую ошибку:

rst = CreateDF(rst_symbol['articles'], columns)
KeyError: 'articles'

В этой строке:

rst = CreateDF(rst_symbol['articles'], columns)

Я думаю, что есть некоторая проблема с ключом не быть найденным или определенным - у кого-нибудь есть идея, как это исправить? Я благодарен за каждую подсказку!

MAiniak

РЕДАКТИРОВАТЬ:

Я нашел решение после того, как попробовал несколько ваших подсказок. По-видимому, ошибка произошла, когда ключ API NewsAPI столкнулся с пределом запроса. Это происходило каждый раз, пока я не изменил limit = 500 на limit = 20. По какой-то причине нет ошибки с новым ключом API и уменьшенным лимитом.

Спасибо за вашу помощь, ребята!

Ответы [ 2 ]

0 голосов
/ 26 марта 2020

В документации python [2] [3] не упоминается ни один метод с именем NewsApi() или GetEverything(), а скорее NewsApiClient() и get_everything(), то есть:

from newsapi import NewsApiClient

# Init
newsapi = NewsApiClient(api_key='xxx')

# /v2/top-headlines
top_headlines = newsapi.get_top_headlines(q='bitcoin',
                                          sources='bbc-news,the-verge',
                                          category='business',
                                          language='en',
                                          country='us')

# /v2/everything
all_articles = newsapi.get_everything(q='bitcoin',
                                      sources='bbc-news,the-verge',
                                      domains='bbc.co.uk,techcrunch.com',
                                      from_param='2017-12-01',
                                      to='2017-12-12',
                                      language='en',
                                      sort_by='relevancy',
                                      page=2)

# /v2/sources
sources = newsapi.get_sources()
0 голосов
/ 26 марта 2020

Вероятно, "статьи" не является одним из ваших столбцов в объекте rst_symbol.

...