【发布时间】:2021-05-13 13:43:39
【问题描述】:
给定一个<div> 包含一个有很多噪音的价格:
Price 1\u00a0500\u00a0000 EUR
而您只想要纯数量(1500000),那么在 Scrapy 中实现这一点的最佳方法是什么?
我尝试结合正则表达式:
il.add_css('price', 'div.price_tag::text', re='([.\d]+)\s*(?:EUR)')
与删除非 ascii 代码的通用管道一起:
def process_item(self, item, spider):
def remove_non_ascii(text):
return ''.join(i for i in text if ord(i)<128)
for key, value in item.items():
item[key] =remove_non_ascii(item[key])
return item
但似乎管道是在正则表达式之后执行的,因此它只会找到“000”而不是“1500000”。
当然,对于那些特定情况,可以在某处构建.replace(),但我更愿意坚持使用可用的标准方法并使其更好地维护。
【问题讨论】:
-
谢谢,这会引发错误
nothing to repeat at position 1。我还使用re.findall(r'(*UCP)\d+(?:\s\d+)*(?=\s*EUR)', 'Price 1\u00a0500\u00a0000 EUR')尝试了不同的环境。 -
啊,是 Python,对不起。当然删除
(*UCP),这在所有意义上都是多余的,试试\d+(?:\s\d+)*(?=\s*EUR) -
谢谢,越来越近了,但它仍然没有删除 NO-BREAK SPACE:
1\xa0500\xa0000我真的应该刷新我的正则表达式流畅度.. -
当然。匹配时不能删除任何内容。这是不可能的。
-
好的,谢谢您的确认!但这现在可以与管道的想法相结合并删除空格。谢谢。如果您发布答案,我会接受。
标签: regex scrapy scrapy-pipeline