这是我的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天并尝试了你能想象到的每一种排列,但总是有相同的结果。
我要么错过了明显的,要么这不是直截了当的。
如果不可能以这种方式,对新路线的任何建议都非常赞赏。
答案 0 :(得分:1)
scrapy管道中的process_item()
方法应该只处理一个项目。如果你举起DropItem
或者返回一些内容,你就会打破循环并放弃其余的解析。
你的循环将在你正在进行的第一次正则表达式匹配后中断,因为return item
和DropItem
都会中断循环并停止当前的管道 - 换句话说它会在第一个循环中断开。
要解决这个问题,只需将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