使用Python和New York Post API从New York Post中提取文章



我正在尝试通过Python上的纽约时报API(关于恐怖袭击的文章)创建一个文本文档的语料库。

我知道NYP API不提供全文文本,但提供了我可以从中抓取文章的URL。因此,我们的想法是从API中提取"web_url"参数,从而抓取全文。

我正在尝试使用Python上的NYT API库:

from nytimesarticle import articleAPI
api = articleAPI("*Your Key*")
articles = api.search( q = 'terrorist attack')
print(articles['response'],['docs'],['web_url'])

但是我不能提取"web_url"或文章。我得到的是这样的输出:

{'meta': {'time': 19, 'offset': 10, 'hits': 0}, 'docs': []} ['docs'] ['web_url']

似乎nytimesarticle模块本身存在问题。例如:

>>> articles = api.search(q="trump+women+accuse", begin_date=20161001)
>>> print(articles)
{'response': {'docs': [], 'meta': {'offset': 0, 'hits': 0, 'time': 21}}, 'status': 'OK', 'copyright': 'Copyright (c) 2013 The New York Times Company.  All Rights Reserved.'}

但是,如果我使用requests(如在模块中使用)直接访问API,我得到我正在寻找的结果:

>>> import requests
>>> r = requests.get("http://api.nytimes.com/svc/search/v2/articlesearch.json?q=trump+women+accuse&begin_date=20161001&api-key=XXXXX")
>>> data = r.json()
>>> len(data["response"]["docs"])
10

表示返回了10篇文章(data的完整值为16kb,因此我不会在这里全部包含)。对比api.search()的响应,其中articles["response"]["docs"]是一个空列表。

nytimesarticle.py只有115行长,所以调试起来非常简单。打印发送到API的URL的值显示如下:

>>> articles = api.search(q="trump+women+accuse", begin_date=20161001)
https://api.nytimes.com/svc/search/v2/articlesearch.json?q=b'trump+women+accuse'&begin_date=20161001&api-key=XXXXX
#                                                          ^^ THIS

违规代码将每个字符串参数编码为UTF-8,这使其成为bytes对象。这是不必要的,并且会破坏如上所示构建的URL。幸运的是,有一个拉请求修复了这个问题:

>>> articles = api.search(q="trump+women+accuse", begin_date=20161001)
http://api.nytimes.com/svc/search/v2/articlesearch.json?begin_date=20161001&q=trump+women+accuse&api-key=XXXXX
>>> len(articles["response"]["docs"])
10

这也允许使用其他字符串参数,如sort="newest",因为字节格式化之前会导致错误。

print语句中的逗号将打印的内容分开。

你会想要这样的东西

articles['response']['docs']['web_url']

但是'docs': []既是一个数组又是空的,所以上面的行不起作用,所以你可以尝试

articles = articles['response']['docs']
for article in articles:
    print(article['web_url']) 

相关内容

最新更新