我最近开始玩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
答案 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')))