刮掉这个嘈杂的价格标签的正确方法
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 正则表达式,你不需要额外的标志。
给定 <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 正则表达式,你不需要额外的标志。