2017-02-22 37 views
0

Я пытаюсь получить некоторые данные из статей NYT (New york times). Когда я выполняю следующий код, это дает мне ошибку, с которой я не знаком, я искал на google и прошел предыдущие ответы из stackoverflow, но не понял мою проблему. Может кто-нибудь, пожалуйста, скажите мне, как решить мою ошибку. Спасибо заранее!ошибка кода python (linux, web scrapping)

код:

from nytimesarticle import articleAPI 
api = articleAPI('a0de895aa110431eb2344303c7105a9f') 

articles = api.search(q = 'Obama', 
    fq = {'headline':'Obama', 'source':['Reuters','AP', 'The New York Times']}, 
    begin_date = 20111231) 

def parse_articles(articles): 
    ''' 
    This function takes in a response to the NYT api and parses 
    the articles into a list of dictionaries 
    ''' 
    news = [] 
    for i in articles['response']['docs']: 
     dic = {} 
     dic['id'] = i['_id'] 
     if i['abstract'] is not None: 
      dic['abstract'] = i['abstract'].encode("utf8") 
     dic['headline'] = i['headline']['main'].encode("utf8") 
     dic['desk'] = i['news_desk'] 
     dic['date'] = i['pub_date'][0:10] # cutting time of day. 
     dic['section'] = i['section_name'] 
     if i['snippet'] is not None: 
      dic['snippet'] = i['snippet'].encode("utf8") 
     dic['source'] = i['source'] 
     dic['type'] = i['type_of_material'] 
     dic['url'] = i['web_url'] 
     dic['word_count'] = i['word_count'] 
     # locations 
     locations = [] 
     for x in range(0,len(i['keywords'])): 
      if 'glocations' in i['keywords'][x]['name']: 
       locations.append(i['keywords'][x]['value']) 
     dic['locations'] = locations 
     # subject 
     subjects = [] 
     for x in range(0,len(i['keywords'])): 
      if 'subject' in i['keywords'][x]['name']: 
       subjects.append(i['keywords'][x]['value']) 
     dic['subjects'] = subjects 
     news.append(dic) 
    return(news) 

def get_articles(date,query): 
    ''' 
    This function accepts a year in string format (e.g.'1980') 
    and a query (e.g.'Amnesty International') and it will 
    return a list of parsed articles (in dictionaries) 
    for that year. 
    ''' 
    all_articles = [] 
    for i in range(0,100): #NYT limits pager to first 100 pages. But rarely will you find over 100 pages of results anyway. 
     articles = api.search(q = query, 
       fq = {'source':['Reuters','AP', 'The New York Times']}, 
       begin_date = date + '0101', 
       end_date = date + '1231', 
       sort='oldest', 
       page = str(i)) 
     articles = parse_articles(articles) 
     all_articles = all_articles + articles 
    return(all_articles) 

Amnesty_all = [] 
for i in range(1980,2014): 
    print 'Processing' + str(i) + '...' 
    Amnesty_year = get_articles(str(i),'Amnesty International') 
    Amnesty_all = Amnesty_all + Amnesty_year 

import csv 
keys = Amnesty_all[0].keys() 
with open('amnesty-mentions.csv', 'wb') as output_file: 
    dict_writer = csv.DictWriter(output_file, keys) 
    dict_writer.writeheader() 
    dict_writer.writerows(Amnesty_all) 

ошибка, которая была сгенерирована при работе в терминале:

[email protected]:~$ cd Desktop 
[email protected]:~/Desktop$ python nyt.py 
Processing1980... 
Traceback (most recent call last): 
    File "nyt.py", line 66, in <module> 
    Amnesty_year = get_articles(str(i),'Amnesty International') 
    File "nyt.py", line 59, in get_articles 
    articles = parse_articles(articles) 
    File "nyt.py", line 14, in parse_articles 
    for i in articles['response']['docs']: 
KeyError: 'response' 
[email protected]:~/Desktop$ python nyt.py 
Processing1980... 
Traceback (most recent call last): 
    File "nyt.py", line 66, in <module> 
    Amnesty_year = get_articles(str(i),'Amnesty International') 
    File "nyt.py", line 59, in get_articles 
    articles = parse_articles(articles) 
    File "nyt.py", line 14, in parse_articles 
    for i in articles['response']['docs']: 
KeyError: 'response' 

ответ

0

api.search возвращает результат не ожидается. Его код:

r = requests.get(url) 
    return r.json() 

Таким образом, только если апи «http://api.nytimes.com/svc/search/v2/articlesearch» возвращает правильный ответ, и ответ имеет правильное тело JSon, вы можете получить код запуска правильно.

Исключение - это KeyError, поэтому объект возврата имеет тип dict. Вы можете проверить:

In [8]: print articles.keys() 
Out[8]: [u'status', u'response', u'copyright'] 

и:

In [9]: print articles['status'] 
Out[9]: u'OK' 

Если нет, я думаю NYT апи не может заполнить ответ, когда статьи [ 'статус'] = 'OK', вам может понадобиться! обрабатывать этот неожиданный статус и повторять попытку.

+0

Спасибо! Я исправлю свою ошибку :) –