【问题标题】:Scrapy Regex Custom PipelineScrapy 正则表达式自定义管道
【发布时间】:2026-01-08 00:20:03
【问题描述】:

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

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

如果无法通过这种方式,任何关于新路线的建议都非常感谢。

【问题讨论】:

  • " 和 "return item" 被触发,其余被丢弃。你说的休息是什么意思?其余的项目?或者循环只是在那一点中断并停止?
  • 如果我如上所述设置了 3 个正则表达式,并且我已经知道其中一个存在于要抓取的网页中,则只返回一个匹配项和一个抓取数据的 URL。我只是不知道为什么会这样。我相信它会持续抓取,但只是将它们分配为“丢弃”。这很奇怪。

标签: python scrapy scrapy-pipeline


【解决方案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

【讨论】:

  • 太棒了!你这个了不起的人。非常感谢,你让我很开心!