Python中的解码和编码

时间:2018-03-10 09:36:17

标签: python

我有一些文本,我试图在Python中解码和编码

{"id":"5aa2496df863482dc4da2067","name":"test","createdAt":"2018-03-10T09:35:31.050353800Z"}

我在Spyder(Python 3.6)的一行中输入了原始推文

我收到以下消息

import html.parser

original_tweet = "I luv my <3 iphone & you’re awsm 
                 apple.DisplayIsAwesome, sooo happppppy  
                 http://www.apple.com"
tweet = original_tweet.decode("utf8").encode('ascii', 'ignore')

是否有另一种方法可以为Python 3.6重写此代码?

1 个答案:

答案 0 :(得分:1)

在Python3 +中,您的original_tweet字符串是UTF-8编码的Unicode字符串,其中包含Unicode emoji。因为Unicode中的65k +字符是256 ASCII个字符的超集,所以不能简单地将Unicode字符串转换为ASCII字符串。

但是,如果您可以忍受一些数据丢失(即删除表情符号),那么您可以尝试以下操作(请参阅thisthis相关问题):

original_tweet = "I luv my <3 iphone & you’re awsm ..."

# Convert the original UTF8 encoded string into an array of bytes.
original_tweet_bytes = original_tweet.encode("utf-8")

# Decode that array of bytes into a string containing only ASCII characters;
# pass errors="strict" to find failing character mappings, and I also suggest
# to read up on the option errors="replace".
original_tweet_ascii = original_tweet_bytes.decode("ascii", errors="ignore")

或者简单的单行:

tweet = original_tweet.encode("utf-8").decode("ascii", errors="ignore")

请注意,转换您可能需要单独处理的HTML entities <&。您可以使用正确的HTML解析器(例如lxml),或使用简单的string replacement

tweet = tweet.replace("&lt;", "<").replace("&amp;", "&")

或者从Python 3.4+开始,您可以使用html.unescape(),如下所示:

tweet = html.unescape(tweet)

另请参阅this question有关如何处理字符串中的HTML实体的信息。

附录。 Python的Unidecode软件包似乎也为此提供了有用的功能,尽管在当前版本中它不能处理emojis。