关于python:Twitter Streaming:尝试/除了IndexError

Twitter Streaming: Try/Except for IndexError

背景:我想从TwitterAPI下载用户tweets的特定部分(例如用户名、ID、扩展的URL等)。我能成功地做到这一点。

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

1
IndexError: list index out of range

目标:如果出现这种情况,跳过并继续收集新的tweets。

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

问题:尝试/例外声明是否是实现此目标的有效方法?如果是,如何正确应用try/except语句?

我尝试了以下方法:

1
2
3
4
5
6
7
8
9
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

但我得到以下错误:

1
UnboundLocalError: local variable 'expanded_url' referenced before assignment

我到处搜索过,有几个与我的问题类似的例子(unboundlocalerror:在赋值之前引用了本地变量"url_request",unboundlocalerror:在赋值之前引用了本地变量"url")。

但我不知道如何直接更改代码,以便实现try/except语句。我也愿意用其他方法来解决这个问题。谢谢您!


当try中的块出错时,将执行except中的块。如果除了(它只通过)之外没有发生任何事情,则不会定义扩展的URL。您应该将except块中的扩展URL分配给默认值或空字符串,无论它是什么:

1
2
3
4
         try:
             expanded_url = t['entities']['urls'][0]['expanded_url']
         except:
             expanded_url = ''


问题是,您可能试图在try/except块之后使用expanded_url,但当代码抛出异常时,您不会创建变量。尝试:

1
2
3
4
5
expanded_url = ''
try:
    expanded_url = ....
except:
    pass

或:

1
2
3
4
try:
    expanded_url = ....
except:
    expanded_url = ''