【问题标题】:Right way to scrape this noisy price tag刮掉这个嘈杂的价格标签的正确方法
【发布时间】: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


【解决方案1】:

你可以使用

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

请参阅regex demo

详情

  • \d+ - 一位或多位数字
  • (?:\s\d+)* - 零个或多个空格序列和一个或多个数字
  • (?=\s*EUR) - 与字符串中的某个位置匹配的正向前瞻,该位置紧跟零个或多个空格,然后是 EUR

注意\s 和其他速记字符类在 Python 3.x 正则表达式中默认支持 Unicode,您不需要额外的标志。

【讨论】:

  • 谢谢,以及消除价格中空白的管道正在回答这个问题。
猜你喜欢
  • 1970-01-01
  • 2015-09-02
  • 1970-01-01
  • 1970-01-01
  • 2021-07-21
  • 2020-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多