我有一些文本,我试图在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重写此代码?
答案 0 :(得分:1)
在Python3 +中,您的original_tweet
字符串是UTF-8编码的Unicode字符串,其中包含Unicode emoji。因为Unicode中的65k +字符是256 ASCII个字符的超集,所以不能简单地将Unicode字符串转换为ASCII字符串。
但是,如果您可以忍受一些数据丢失(即删除表情符号),那么您可以尝试以下操作(请参阅this或this相关问题):
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("<", "<").replace("&", "&")
或者从Python 3.4+开始,您可以使用html.unescape()
,如下所示:
tweet = html.unescape(tweet)
另请参阅this question有关如何处理字符串中的HTML实体的信息。
附录。 Python的Unidecode软件包似乎也为此提供了有用的功能,尽管在当前版本中它不能处理emojis。