2015-04-29 56 views
0

我试图从已识别的推文中获取纬度/经度坐标。我遇到的部分是if decoded['coordinates']!=None: t.write(str(decoded['coordinates']['coordinates'])块。我不知道它是否正常工作,因为有时~150推文会在返回错误之前以坐标[None]的形式返回,所以我相信当找到带有坐标的推文时,错误会再次出现,然后返回KeyError: 'coordinates'使用tweepy从已识别的推文获取纬度/经度坐标;获取KeyError:'坐标'

下面是我的代码:

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']) 

任何帮助吗?谢谢。

+0

't.write(str(decoded ['coordinates'] ['coordinates']))'看起来很奇怪。你打算在那里写两次“坐标”吗? – Kevin

+0

是的。 decode ['coordinates']返回json和python的混合,它看起来像{'type':'“,'place':”“,'coordinates':[-123.45667],[123.235667]}, 'coordinates'] ['coordinates']只返回[-123.45667],[123.235667]。 – triscuit312

+0

当然,最简单的做法是在't.print ...'行之前打印'coded ['coordinates']'的内容。从回溯看来,它看起来没有关键的“坐标”。 – SiHa

回答

2

并非所有的鸣叫对象包含“坐标”键,所以你要检查它像这样的东西存在:

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

+0

所以,你认为我可以把它放在那里,如果阻塞,然后添加第三行,说t.write(坐标)的东西? – triscuit312