【问题标题】:Python - 'ascii' codec can't decode byte \xbd in positionPython - 'ascii' 编解码器无法在位置解码字节 \xbd
【发布时间】:2013-12-05 07:25:56
【问题描述】:

我正在使用 LXML 从网页中抓取一些文本。一些文本包括分数。

我需要把它变成浮点格式。这些失败:

ugly_fraction.encode('utf-8')  #doesn't change to usable format
ugly_fraction.replace('\xbd', '')  #throws error
ugly_freaction.encode('utf-8').replace('\xbd', '')  #throws error

【问题讨论】:

  • 没有将分数字符转换为浮点数的本机功能。您所有的编码/解码都将实现将一个字符转换为另一个字符。您需要一个更全面的函数来识别每个分数并将其转换为数值。某种使用映射到等效浮点值的 unicode 键的字典查找。
  • 这就是我试图用 replace() 函数做的事情,但我也无法让它工作。我该怎么做?
  • @SpliFF:是的,有本地功能可以做到这一点。
  • 您是要提取实际的浮点值,还是只想将字符串中的所有小数表示形式转换为小数形式?
  • @abarnert:想详细说明一下吗?

标签: python unicode web-scraping lxml


【解决方案1】:

unicodedata.numeric:

以浮点数形式返回分配给 Unicode 字符 unichr 的数值。如果没有定义这样的值,则返回默认值,或者,如果没有给出,则引发 ValueError。

请注意,它只处理单个字符,而不是字符串。因此,您仍然需要编写将由整数和分数字符组成的“混合分数”转换为浮点数的代码。但这很容易。例如。您只需要想出如何在数据中表示混合分数的规则。例如,如果纯整数、纯分数和整数后跟一个没有空格的分数是唯一的可能性,这有效(包括为所有无效情况提出某种合理的例外):

def parse_mixed_fraction(s):
    if s.isdigit():
        return float(s)
    elif len(s) == 1:
        return unicodedata.numeric(s[-1])
    else:
        return float(s[:-1]) + unicodedata.numeric(s[-1])

【讨论】:

  • +1 教我一个以前不为人知的图书馆!谢谢!
  • 非常感谢。对于一个非常非常烦人的问题非常有用的答案。投票赞成
猜你喜欢
  • 2011-06-29
  • 2013-10-16
  • 2016-02-13
  • 2015-01-14
  • 1970-01-01
  • 2013-08-20
  • 1970-01-01
  • 2014-02-10
  • 2017-10-19
相关资源
最近更新 更多