Twitter Streaming:尝试/除了IndexError

时间:2017-04-17 19:07:21

标签: python twitter

背景:我想从twitter api下载用户推特的特定部分(例如用户名,ID,扩展网址等)。我能够成功地做到这一点。

问题:由于并非所有用户都有expanded_url,我有时会收到以下错误:

IndexError: list index out of range

目标:如果发生此类IndexError,请跳过并继续收集新推文

我认为解决此问题的一种方法是使用try / except语句

问题: try / except语句是实现此目标的有效方法吗?如果是这样,我如何正确应用try / except语句?

我尝试了以下内容:

class StdOutListener(StreamListener):
         def on_data(self, data):
             t = json.loads(data)
             tweet_id = t['id_str'] 
             user_name = t['user']['name'] 
             try:
                 expanded_url = t['entities']['urls'][0]['expanded_url']
             except:
                 pass 

但是我收到以下错误:

UnboundLocalError: local variable 'expanded_url' referenced before assignment

我搜索了SO,并提供了一些类似于我的问题的示例(UnboundLocalError: local variable 'url_request' referenced before assignmentUnboundLocalError: local variable 'url' referenced before assignment

但我不确定如何直接更改我的代码,以便我可以实现try / except语句。 我也对其他解决这个问题的方法持开放态度。 谢谢!

2 个答案:

答案 0 :(得分:2)

当try内部的块出错时,except内的块被执行。如果你的除外没有任何反应(它只通过),则永远不会定义expanded_url。您应该将except块中的expanded_url分配给默认值或空字符串,无论它应该是什么:

         try:
             expanded_url = t['entities']['urls'][0]['expanded_url']
         except:
             expanded_url = ''

答案 1 :(得分:0)

问题是您可能尝试在$arr = $this->createQueryBuilder('ad') ->select('ad.extId') ->where('ad.extId is not NULL') ->getQuery() ->getArrayResult(); return array_map(function($a){ return $a['extId']; }, $arr); 块之后使用expanded_url,但是当您的代码抛出异常时,您不会创建变量。尝试:

try/except

或者:

expanded_url = ''
try:
    expanded_url = ....
except:
    pass