【问题标题】:Decoding and Encoding in PythonPython中的解码和编码
【发布时间】:2018-08-18 20:08:43
【问题描述】:

我有一些文本要尝试在 Python 中解码和编码

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')

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

我收到以下消息

AttributeError: 'str' object has no attribute 'decode'

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

【问题讨论】:

  • 您似乎对 Python 中的字符串代表什么以及编码或解码的作用感到困惑。编码将字符串转换为字节,解码则相反。鉴于此,您的调用没有意义,因此它也失败了。
  • 这是我正在关注的网站,无法理解发生了什么:analyticsvidhya.com/blog/2014/11/…
  • 您不能使用str.encode()bytes.decode() 来处理HTML 实体<&,如果这是您想要做的。为此查看 Parsing HTML with lxml 之类的库(基于您导入 HTML 解析器)。但是,您的字符串 original_tweet 不是正确的 HTML,因此您可以考虑先捏造它……
  • @cordelia 该网站的代码没有任何意义。如果您的 original_tweet 值已经是字符串,则无需对其进行编码或解码。如果是字节串(即bytes对象),decode一次得到字符串。
  • 我相信该网站上的代码是为 Python 2 编写的。在那里,一个常规字符串(不带 u 前缀)是一个字节序列,可以解码。

标签: python


【解决方案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 包似乎也为此提供了有用的功能,尽管在其当前版本中它不处理表情符号。

【讨论】:

  • 非常感谢您帮助我解决这个问题。这真正解决了我的疑问。
  • 我如何避免丢失“你的”?很抱歉打扰您,但我刚刚注意到了。
  • @cordelia, 字符是 Unicode 字符 U+2019,在 ASCII 中没有直接等价物。但是,您可以使用str.replace() 将所有 替换为ASCII ',并将双引号 替换为ASCI "。另请参阅此问题:Replacing unicode punctuation with ASCII approximations
  • 感谢@Jens
猜你喜欢
  • 2017-12-25
  • 1970-01-01
  • 2015-12-05
  • 1970-01-01
  • 2013-05-15
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 2015-06-23
相关资源
最近更新 更多