我最近开始使用Twython和Twitter API。身份验证处理起来有点麻烦,但它现在可以与我的脚本中包含的一个小 Bottle 网络服务器完美配合。
我正在尝试做一些非常简单的事情:使用流式过滤器 API 跟踪主题标签。起初它似乎运行良好,但现在我可以在我的日志中看到许多错误:
Error!
200 Unable to decode response, not valid JSON
它只发生在部分推文上。我以为它可以链接到坐标,但事实并非如此。我刚刚测试过,这似乎是由口音(éèêàâ...(编码问题引起的。
我该如何解决这个问题?
我的流光代码非常基本:
class QMLStreamer(TwythonStreamer):
def on_success(self, data):
if 'text' in data:
if 'coordinates' in data and data['coordinates'] and 'coordinates' in data['coordinates']:
tweetlog("[%s](%s) - %s" % (data['created_at'], data['coordinates']['coordinates'], data['text'].encode('utf-8')))
else:
tweetlog("[%s] - %s" % (data['created_at'], data['text'].encode('utf-8')))
def on_error(self, status_code, data):
print colored('Error !', 'red', attrs=['bold'])
print status_code, data
错误发生在代码中。您不应该在这里使用.encode()
。
这有点违反直觉,但如果on_success()
引发异常,就会调用on_error()
,这可能是这里发生的事情(UnicodeDecodeError
(。这就是您看到错误代码 200("HTTP Ok"(的原因。
Twython 将数据作为 unicode 对象返回,因此您可以执行以下操作:
print(u"[%s](%s) - %s" % (data['created_at'], data['coordinates']['coordinates'], data['text']))
您可能应该添加自己的尝试...除了阻止on_success()
进一步调试。
另外,我不确定您的tweetlog()
函数的作用,但请注意,如果您使用的是Windows,print()
编写某些代码点时可能会遇到问题,因为它将尝试转换为终端的代码页。
没有一个完美的答案,但您可以尝试使用 unicodedata 打印文本的规范化版本:
import unicodedata
。
tweetlog("[%s](%s) - %s" % (data['created_at'], data['coordinates']['coordinates'], unicodedata.normalize('NFD',data['text']).encode('ascii', 'ignore')))