Python - 'ascii' 编解码器无法解码位置 \xbd 的字节

4
我正在使用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键映射到等效的浮点值。 - SpliFF
这是我试图使用replace()函数来实现的,但我也无法让它工作。我该怎么做? - appleLover
@SpliFF:是的,有本地功能可以做到这一点。 - abarnert
你是想提取实际的浮点数值,还是只是想将字符串中所有分数表示转换为十进制? - SpliFF
1
@abarnert:能详细说明一下吗? - SpliFF
显示剩余2条评论
1个回答

9

unicodedata.numeric

将Unicode字符unichr的数字值作为float返回。如果没有定义这样的值,则返回默认值,或者如果未给出,则引发ValueError异常。

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

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

2
+1 因为教我一个之前不知道的库!谢谢! - VooDooNOFX
非常感谢。这个回答对于一个真的、真的很烦人的问题非常有帮助。已点赞。 - Unknown Coder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接