刮擦正则表达式自定义管道



这是我的 Scrapy 自定义正则表达式管道代码:

for p in item['code']:
        for search_type, pattern in RegEx.regexp.iteritems():
            s = re.findall(pattern, p)
                if s:
                    return item
                else: 
                    raise DropItem

这是我的正则表达式代码:

class RegEx(object):
regexp = {
    'email' : re.compile('liczba'), 'whatever' : re.compile(r'mit'), 'blu' : re.compile(r'houseLocked'),}

不是真正编译的正则表达式,仅用于演示目的。

这有效,但是一旦找到匹配项并触发"返回项",其余项就会被删除。

是否可以继续在 Scrapy 管道中迭代?

我已经在这里呆了 4 天,并尝试了你能想象到的所有排列,但结果总是相同的。

我要么错过了显而易见的东西,要么这并不简单。

如果以这种方式无法实现,则非常感谢有关新路线的任何建议。

scrapy 管道中的 process_item() 方法应仅处理一个项目。如果你引发DropItem或返回一些东西,你会中断循环并丢弃其余的解析。

您的循环将在您正在执行的第一个正则表达式匹配后中断,因为return itemDropItem都会中断循环并停止当前管道 - 换句话说,它将在第一个循环中断。

要解决此问题,只需将DropItem移动到主循环之外:

def process_item(self, item):
    for p in item['code']:
        for search_type, pattern in RegEx.regexp.iteritems():
            if re.findall(pattern, p):
                return item  # one match found == item is valid, return
    # if this is reached, it means no matches were found
    # and we don't want this item
    raise DropItem

最新更新