刮掉这个嘈杂的价格标签的正确方法

Right way to scrape this noisy price tag

给定 <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() 用于那些特定情况,但我更愿意坚持使用可用的标准方法并使其更好地维护。

您可以使用

\d+(?:\s\d+)*(?=\s*EUR)

参见regex demo

详情:

  • \d+ - 一位或多位数字
  • (?:\s\d+)* - 零个或多个空白序列和一个或多个数字
  • (?=\s*EUR) - 匹配字符串中紧跟零个或多个空格然后 EUR.
  • 的位置的正先行

注意 \s 和其他 shorthand 字符 类 在 Python 3.x 正则表达式,你不需要额外的标志。