2017-01-30 11 views
0

Это мой Scrapy код пользовательских регулярных выражений трубопровода:Scrapy Regex Пользовательские Pipeline

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 

И это мой Regex код:

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

Не реальное скомпилирован регулярное выражение, как только для демонстрационных целей.

Это работает, но как только совпадение найдено, и срабатывает «возвращенный элемент», остальное отбрасывается.

Можно ли продолжить итерацию в трубопроводе Scrapy?

Я был в этом в течение 4 дней и пробовал каждую перестановку, которую вы можете себе представить, но всегда тот же результат.

У меня либо отсутствует очевидное, либо это не просто.

Если это невозможно, то любые рекомендации по новому маршруту получили высокую оценку.

+0

«и„возвращение пункт“срабатывает, остальное отбрасывается.» что вы подразумеваете под покой? остаток предметов? или что цикл просто ломается и останавливается в этой точке? – Granitosaurus

+0

Если я задал 3 регулярных выражения, как указано выше, и я уже знаю, что один из них существует на одной из веб-страниц, которые нужно очистить, возвращается только одно совпадение и один URL скребковых данных. Я просто не знаю, почему это происходит. Я считаю, что это непрерывное очищение, но просто назначает их «отброшенными». Это странно. – Stuart

ответ

0

Метод 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 
+0

О, замечательно! Ты чудесный человек. Большое вам спасибо, вы сделали мой день! – Stuart