Getting lat/long coordinates from identified tweets using tweepy; getting KeyError: 'coordinates'
Getting lat/long coordinates from identified tweets using tweepy; getting KeyError: 'coordinates'
我正在尝试从已识别的推文中获取 lat/long 坐标。我遇到问题的部分是 if decoded['coordinates']!=None: t.write(str(decoded['coordinates']['coordinates'])
块。我不知道它是否有效,因为有时 ~150
推文会在返回错误之前以 [None]
的坐标返回,所以我相信当找到带有坐标的推文时错误会回来, 然后 returns KeyError: 'coordinates'
.
以下是我的代码:
import tweepy
import json
from HTMLParser import HTMLParser
import os
consumer_key = ''
consumer_secret = ''
access_token = ''
access_token_secret = ''
# This is the listener, resposible for receiving data
class StdOutListener(tweepy.StreamListener):
def on_data(self, data):
# Twitter returns data in JSON format - we need to decode it first
decoded = json.loads(HTMLParser().unescape(data))
os.chdir('/home/scott/810py/Project')
t = open('hashtagHipster.txt','a')
# Also, we convert UTF-8 to ASCII ignoring all bad characters sent by users
#if decoded['coordinates']:
# decoded['coordinates'] returns a few objects that are not useful,
# like type and place which we don't want. ['coordinates'] has a
# second thing called ['coordinates'] that returns just the lat/long.
# it may be that the code is correct but location is so few and far
# between that I haven't been able to capture one. This program just
# looks for 'hipster' in the tweet. There should be a stream of tweets
# in the shell and everytime one that has coordinates tehy should be
# added to the file 'hashtagHipster.txt'. Let me know what you think.
if decoded['coordinates']!=None:
t.write(str(decoded['coordinates']['coordinates'])) #gets just [LAT][LONG]
print '[%s] @%s: %s' % (decoded['coordinates'], decoded['user']['screen_name'], decoded['text'].encode('ascii', 'ignore'))
print ''
return True
def on_error(self, status):
print status
if __name__ == '__main__':
l = StdOutListener()
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
print "Showing all new tweets for #hipster:"
# There are different kinds of streams: public stream, user stream, multi-user streams
# In this example follow #vintage tag
# For more details refer to https://dev.twitter.com/docs/streaming-apis
stream = tweepy.Stream(auth, l)
stream.filter(track=['hipster'])
有什么帮助吗?谢谢。
并非所有推文对象都包含 'coordinates' 键,因此您必须检查它是否存在,如下所示:
if decoded.get('coordinates',None) is not None:
coordinates = decoded.get('coordinates','').get('coordinates','')
另外,请注意:
"Comparisons to singletons like None should always be done with 'is' or 'is not', never the equality operators."
(PEP 8)
我正在尝试从已识别的推文中获取 lat/long 坐标。我遇到问题的部分是 if decoded['coordinates']!=None: t.write(str(decoded['coordinates']['coordinates'])
块。我不知道它是否有效,因为有时 ~150
推文会在返回错误之前以 [None]
的坐标返回,所以我相信当找到带有坐标的推文时错误会回来, 然后 returns KeyError: 'coordinates'
.
以下是我的代码:
import tweepy
import json
from HTMLParser import HTMLParser
import os
consumer_key = ''
consumer_secret = ''
access_token = ''
access_token_secret = ''
# This is the listener, resposible for receiving data
class StdOutListener(tweepy.StreamListener):
def on_data(self, data):
# Twitter returns data in JSON format - we need to decode it first
decoded = json.loads(HTMLParser().unescape(data))
os.chdir('/home/scott/810py/Project')
t = open('hashtagHipster.txt','a')
# Also, we convert UTF-8 to ASCII ignoring all bad characters sent by users
#if decoded['coordinates']:
# decoded['coordinates'] returns a few objects that are not useful,
# like type and place which we don't want. ['coordinates'] has a
# second thing called ['coordinates'] that returns just the lat/long.
# it may be that the code is correct but location is so few and far
# between that I haven't been able to capture one. This program just
# looks for 'hipster' in the tweet. There should be a stream of tweets
# in the shell and everytime one that has coordinates tehy should be
# added to the file 'hashtagHipster.txt'. Let me know what you think.
if decoded['coordinates']!=None:
t.write(str(decoded['coordinates']['coordinates'])) #gets just [LAT][LONG]
print '[%s] @%s: %s' % (decoded['coordinates'], decoded['user']['screen_name'], decoded['text'].encode('ascii', 'ignore'))
print ''
return True
def on_error(self, status):
print status
if __name__ == '__main__':
l = StdOutListener()
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
print "Showing all new tweets for #hipster:"
# There are different kinds of streams: public stream, user stream, multi-user streams
# In this example follow #vintage tag
# For more details refer to https://dev.twitter.com/docs/streaming-apis
stream = tweepy.Stream(auth, l)
stream.filter(track=['hipster'])
有什么帮助吗?谢谢。
并非所有推文对象都包含 'coordinates' 键,因此您必须检查它是否存在,如下所示:
if decoded.get('coordinates',None) is not None:
coordinates = decoded.get('coordinates','').get('coordinates','')
另外,请注意:
"Comparisons to singletons like None should always be done with 'is' or 'is not', never the equality operators."
(PEP 8)