Tweepy:始终以推文文本的“\ ud83d \ ude4c”格式显示表情符号

时间:2016-05-16 18:30:53

标签: python twitter unicode tweepy emoji

我的问题

使用tweepy传输数据时,我会收到

的预期结果
Tweet Contents: RT @ChickSoPretty: Zendaya tho \ud83d\ude4c https:....

使用代码时

def on_data(self, data):
    username = data.split(',"screen_name":"')[1].split('","location"')[0]
    tweet = data.split(',"text":"')[1].split('","source')[0]
    print("Tweet Contents: " + tweet)

--- 我目前正在跟踪 u'\ U0001f64c',这是表情符号的代码。 ---

然而,当我尝试输出用户最近推特的其余部分时......

for status in tweepy.Cursor(api.user_timeline, id=username).items(20):
    tweet = status.text
    print("Tweet Contents: " + tweet)

“username”是最近使用过表情符号的用户,我的程序崩溃了。

这是可以理解的,因为我现在正试图在控制台上打印表情符号,而不是我最初做的,而是显示Javascript Escape代码, \ ud83d \ ude4c

我的问题是,我如何阅读用户的状态并以第一种格式输出他们的推文?

我的代码的目的

我的长期目标是迭代用户的状态,并检查他们在最近的20条推文中使用了多少表情符号(包括RT和回复)。

当emojis以Javascript / Java Escape格式显示时,我已经“成功创建”了一些用于在推文中检测表情符号的乱码,如下所示......

for character in tweet:
  iteration = iteration + 1
  if(iteration < tweetLength):
    if tweet[iteration] == '\\' and tweet[iteration + 1] == 'u' and tweet[iteration + 6] == '\\' and tweet[iteration + 7] == 'u':           
    for x in range(0,12):
      emojiCode += tweet[iteration + x]                                        
      numberOfEmojis = numberOfEmojis + 1
      print("Emoji Code Found: "+emojiCode)  
      emojiCode = ""          
      iteration = iteration + 7
哇,真是一团糟。但是,它适用于我需要它做的事情(只有英文推文)。

有更好的方法吗?我应该废弃它并使用

tweet.encode('utf-8')

并尝试以下列输出格式查找表情符号?

b'@Jathey3 @zachnahra31 this hard\xf0\x9f\x98\x82 we gotta do this https:...'

我正在使用Python 3.4.2

1 个答案:

答案 0 :(得分:0)

  

有更好的方法吗?

是:不要尝试使用低级别逐字符串字符串处理来处理JSON格式的数据。标准库中提供了可以更快,更可靠地完成此任务的工具。

搜索字符的JSON-string-literal编码形式很棘手,因为您不知道它是作为\ud83d\ude4c包含还是仅包含原始字符(U + 1F64C人员庆祝双手)。任何其他非表情符号字符也可能被编码为\u转义符,例如\u0061\u0061aa。当你有双反斜杠或转义引号时会发生什么事情的规则,在寻找一个字符的同时很难处理,并且当你遇到属性顺序和空白格式时会出现任何问题试图找到你想要的房产。

使用json模块的loads方法将JSON字符串解码为包含可直接检查的原始字符串的Python字典,从而避免所有这些陷阱。

然后,为了查找某个范围内的字符,有re模块提供的正则表达式。

最后,如果要以JSON格式显示输出\ud83d\ude4c,可以使用json.dumps方法将该输出编码回JSON。

# Assuming input like:
json_input= '{"screen_name":"fred","location":"home","text":"Here is an emoji: ... and here is another one "}'

import json, re
emoji_pattern = re.compile('[\U0001F300-\U0001F64F]')

dict_input = json.loads(json_input)
text = dict_input['text']
screen_name = dict_input['screen_name']
emojis = emoji_pattern.findall(text)

print(len(emojis), 'chars found in post by', screen_name)
for emoji in emojis:
    print('emoji: ' + json.dumps(emoji))

2 chars found in post by fred
Character: "\ud83d\ude4c"
Character: "\ud83d\udca9"

(这假设只有U + 1F300到U + 1F64F范围内的字符才算作真正的表情符号。还有其他字符可以被归类为表情符号,但这是另一种蠕虫。加上未来的Unicode版本可能会添加更多新角色。)

(旁注:\U中的re对Python 3.3之前的'窄'Python构建用户不起作用。)