Scrapy Regex Custom Pipeline

时间:2017-01-30 18:32:48

标签: python scrapy scrapy-pipeline

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

static t_ctrl       *get_free_block(size_t size)
{
  t_ctrl        *tmp;

  tmp = g_map.head;
  while (tmp != NULL)
    {
      if (tmp->is_free == TRUE && tmp->size < size)
        {
          tmp->is_free = FALSE;
          return (tmp);
        }
      tmp = tmp->next;
    }
  return (NULL);
}

这是我的ReGex代码:

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

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

这样可行,但一旦找到匹配项,并且触发“返回项目”,其余部分将被删除。

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

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

我要么错过了明显的,要么这不是直截了当的。

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

1 个答案:

答案 0 :(得分: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