2017-01-30 4 views
0

これは私のScrapyカスタム正規表現パイプラインコードです: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日間行っていて、あなたが想像しているすべての順列を試しましたが、いつも同じ結果になりました。

私は明白でないか、これは簡単ではありません。

この方法では不可能な場合は、新しいルートの推奨事項は非常に高く評価されます。

+0

』と」リターン項目:

はそれがちょうどメインループのDropItem外を移動是正しますあなたは休息によって何を意味するのですか?残りのアイテム?またはループはちょうどその時点で壊れて停止しますか? – Granitosaurus

+0

私は3つの正規表現を上記のように設定し、それぞれが1つのWebページにスクラップされることが既に分かっている場合は、1つの一致が返され、1つのURLはスクラップされたデータです。なぜ私はこれが起こっているのか分かりません。私はそれが継続的に掻き分けていると信じていますが、単純にそれらを「落としたもの」として割り当てます。それは奇妙だ。 – Stuart

答えて

0

治療パイプラインのprocess_item()メソッドは、1つのアイテムのみを処理する必要があります。 DropItemを呼び出すか、何かを返すと、ループが中断され、残りの解析が破棄されます。

return itemDropItemの両方がループを壊して現在のパイプラインを停止するため、最初の正規表現マッチの後にループが壊れます。つまり、最初のループで中断します。 「残りは廃棄されトリガされます。 『

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