2017-01-30 45 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

「和‘退貨項目’被觸發,其餘的被丟棄。」你休息的意思是什麼?其餘的項目?或者循環剛剛打破並停在那一點? – Granitosaurus

+0

如果我如上所述設置了3個正則表達式,並且我已經知道其中一個存在於要被抓取的網頁之一中,則只返回一個匹配並且一個刮取數據的URL。我只是不知道爲什麼會發生這種情況。我相信它不斷刮擦,但只是將它們分配爲「丟棄」。有點奇怪。 – Stuart

回答

0

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 
+0

哦,太棒了!你是個不可思議的人。非常感謝你,你已經度過了我的一天! – Stuart