TwythonStreamer口音编码? - 无法解码响应,无效JSON,代码为200

时间:2013-10-08 12:37:39

标签: python json twitter stream twython

我最近开始玩Twython和twitter API。 auth处理起来有点麻烦,但它现在与我脚本中包含的一个小小的Web服务器完美配合。

我正在尝试做一些非常简单的事情:使用流式过滤器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

2 个答案:

答案 0 :(得分:2)

错误发生在您的代码中。你不应该在这里使用.encode()

这有点违反直觉,但如果on_error()引发异常,则会调用on_success(),这可能就是这里发生的事情(UnicodeDecodeError)。这就是你看到错误代码200(“HTTP Ok”)的原因。

Twython将数据作为unicode对象返回,所以你可以这样做:

print(u"[%s](%s) - %s" % (data['created_at'], data['coordinates']['coordinates'], data['text']))

您应该在on_success()中添加自己的try ... except块以进行进一步调试。

另外,我不确定你的tweetlog()函数是做什么的,但请注意,如果你在Windows上print()可能在编写一些代码点时遇到问题,因为它会尝试转换为终端的代码页

答案 1 :(得分:0)

不是一个完美的答案,但您可以尝试使用unicodedata打印文本的标准化版本:

import unicodedata

...

tweetlog("[%s](%s) - %s" % (data['created_at'], data['coordinates']['coordinates'], unicodedata.normalize('NFD',data['text']).encode('ascii', 'ignore')))