使用scrapy获取食谱,无法解析字符串:
我正在尝试解析这个字符串" 1 - 1 1/2杯Grated Raw Cauliflower"
并且短划线由python解释为以下
" ValueError:Fraction的文字无效:u' \ u2013' "
无论如何我可以错误处理所以整个程序都不会抛出?
概述:
使用正则表达式将字符串解析为数字,度量,项目。 转换为浮动 检测分数 将分数转换为浮动
我试过/除了简单地犯错误#34; min"提供的范围的一面,虽然我理想地想要以某种方式
if re.compile("[^\W\d]").search(quantity):
match = re.compile("[^\W\d]").search(quantity)
amount = s[:match.start()]
grocery = s[item.start():]
if '/' not in amount:
amount = float(amount)
elif '/' in amount:
def tryAmount(amount):
try:
return round(float(sum(Fraction(s) for s in amount.split())), 2)
except ValueError:
return amount[0]
amount= tryAmount(amount)
else:
amount = amount[0]
答案 0 :(得分:4)
让我们通过:
quantity = "1 – 1 1/2 cup Grated Raw Cauliflower"
match = re.compile("[^\W\d]").search(quantity)
因此match.group(0)
为c
,意味着amount = s[:match.start()]
将amount
设为"1 – 1 1/2 "
amount.split()
将为['1', '\xe2\x80\x93', '1', '1/2']
(如果已打印,则为['1', '–', '1', '1/2']
)并且您已将每个值传递给Fraction()
,而>>> Fraction('–')
...
ValueError: Invalid literal for Fraction: '\xe2\x80\x93'
则不能em-dash,甚至是连字符:
sum(Fraction(s) for s in amount.split()))
理解1
无论如何都不会做你想要的:如果它按照书面形式工作,它会加起来1
,0.5
和2.5
来{ {1}},高于建议值'介于1和1.5'。
我想你可能需要重新审视你提取数字的方法,并解释食谱中的范围!