如果我运行我的代码没有最后一行:getVal(tweet['retweeted_status']['favorite_count']),,那么抓取就可以了,但是当我添加这一行时,我得到一个错误消息KeyError: 'retweeted_status'
有人知道我做错了什么吗?
q = "David_Cameron"
results = twitter_user_timeline(twitter_api, q)
print len(results)
# Show one sample search result by slicing the list...
# print json.dumps(results[0], indent=1)
csvfile = open(q + '_timeline.csv', 'w')
csvwriter = csv.writer(csvfile)
csvwriter.writerow(['created_at',
'user-screen_name',
'text',
'coordinates lng',
'coordinates lat',
'place',
'user-location',
'user-geo_enabled',
'user-lang',
'user-time_zone',
'user-statuses_count',
'user-followers_count',
'user-created_at'])
for tweet in results:
csvwriter.writerow([tweet['created_at'],
getVal(tweet['user']['screen_name']),
getVal(tweet['text']),
getLng(tweet['coordinates']),
getLat(tweet['coordinates']),
getPlace(tweet['place']),
getVal(tweet['user']['location']),
getVal(tweet['user']['geo_enabled']),
getVal(tweet['user']['lang']),
getVal(tweet['user']['time_zone']),
getVal(tweet['user']['statuses_count']),
getVal(tweet['user']['followers_count']),
getVal(tweet['user']['created_at']),
getVal(tweet['retweeted_status']['favorite_count']),
])
print "done"发布于 2016-01-16 23:05:44
根据https://dev.twitter.com/overview/api/tweets上的API,这个属性可能存在,也可能不存在。
如果该属性不存在,您将无法访问该属性。您可以使用in运算符进行安全查找,通过首先检查是否存在来访问它
retweeted_favourite_count = tweet['retweeted_status']['favourite_count'] if 'retweeted_status' in tweet else None
或者采用假设它存在但不存在时进行处理的方式
try: retweeted_favourite_count = tweet['retweeted_status']['favourite_count'] except KeyError: retweeted_favourite_count = 0
然后在write row函数中分配retweeted_favourite_count值。
此外,您的CSV标题行缺少对转发的收藏计数的描述
更新示例:for tweet in results: #Notice this is one long line not two rows. retweeted_favourite_count = tweet['retweeted_status']['favourite_count'] if 'retweeted_status' in tweet else None csvwriter.writerow([tweet['created_at'], getVal(tweet['user']['screen_name']), getVal(tweet['text']), getLng(tweet['coordinates']), getLat(tweet['coordinates']), getPlace(tweet['place']), getVal(tweet['user']['location']), getVal(tweet['user']['geo_enabled']), getVal(tweet['user']['lang']), getVal(tweet['user']['time_zone']), getVal(tweet['user']['statuses_count']), getVal(tweet['user']['followers_count']), getVal(tweet['user']['created_at']), # And insert it here instead getVal(retweeted_favourite_count), ])
您还可以交换线路:
getVal(tweet['retweeted_status']['favorite_count'])
根据Padriac Cunningham的建议
getVal(tweet.get('retweeted_status', {}).get('favourite_count', None)
发布于 2016-01-19 01:03:17
仅供参考,对于任何未来看到这一点的人来说...使用下面的代码,我设法让代码正常工作。getVal( tweet ' favorite _ count ')给出一条推文的收藏计数。
q = "SkyNews"
results = twitter_user_timeline(twitter_api, q)
csvfile = open(q + '_timeline.csv', 'w')
csvwriter = csv.writer(csvfile)
csvwriter.writerow(['created_at',
'user-screen_name',
'text',
'language',
'coordinates lng',
'coordinates lat',
'place',
'user-location',
'user-geo_enabled',
'user-lang',
'user-time_zone',
'user-statuses_count',
'user-followers_count',
'user-friend_count',
'user-created_at',
'favorite_count',
'retweet_count',
'user-mentions',
'urls',
'hashtags',
'symbols'])
for tweet in results:
csvwriter.writerow([tweet['created_at'],
getVal(tweet['user']['screen_name']),
getVal(tweet['text']),
getVal(tweet['lang']),
getLng(tweet['coordinates']),
getLat(tweet['coordinates']),
getPlace(tweet['place']),
getVal(tweet['user']['location']),
getVal(tweet['user']['geo_enabled']),
getVal(tweet['user']['lang']),
getVal(tweet['user']['time_zone']),
getVal(tweet['user']['statuses_count']),
getVal(tweet['user']['followers_count']),
getVal(tweet['user']['friends_count']),
getVal(tweet['user']['created_at']),
getVal(tweet['favorite_count']),
getVal(tweet['retweet_count']),
tweet['entities']['user_mentions'],
tweet['entities']['urls'],
tweet['entities']['hashtags'],
tweet['entities']['symbols'],
])
print "done"其中,getVal、getLng和getLat在前面的代码中定义为:
def getVal(val):
clean = ""
if isinstance(val, bool):
return val
if isinstance(val, int):
return val
if val:
clean = val.encode('utf-8')
return clean
def getLng(val):
if isinstance(val, dict):
return val['coordinates'][0]
def getLat(val):
if isinstance(val, dict):
return val['coordinates'][1]
def getPlace(val):
if isinstance(val, dict):
return val['full_name'].encode('utf-8')https://stackoverflow.com/questions/34827160
复制相似问题