0

这是我的 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 天,尝试了你能想象到的每一种排列方式,但结果总是一样的。

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

如果以这种方式不可能,任何对新路线的建议都非常感谢。

4

1 回答 1

1

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
于 2017-01-30T19:19:38.623 回答