scrapy 2.3 輸入和輸出處理器

2021-06-09 10:08 更新

項目加載器為每個(項目)字段包含一個輸入處理器和一個輸出處理器。輸入處理器一旦接收到提取的數(shù)據(jù)(通過 ?add_xpath()? , ?add_css()? 或 ?add_value()? 方法),輸入處理器的結(jié)果被收集并保存在itemloader中。在收集所有數(shù)據(jù)之后, ?ItemLoader.load_item()? 方法來填充和獲取填充的 item object . 此時,將使用先前收集的數(shù)據(jù)(并使用輸入處理器處理)調(diào)用輸出處理器。輸出處理器的結(jié)果是分配給項目的最終值。

讓我們看一個例子來說明如何為一個特定的字段調(diào)用輸入和輸出處理器(這同樣適用于任何其他字段)::

l = ItemLoader(Product(), some_selector)
l.add_xpath('name', xpath1) # (1)
l.add_xpath('name', xpath2) # (2)
l.add_css('name', css) # (3)
l.add_value('name', 'test') # (4)
return l.load_item() # (5)

所以發(fā)生的是:

  1. 數(shù)據(jù)來自 ?xpath1? 提取并通過 輸入處理器 的 ?name? 字段。輸入處理器的結(jié)果被收集并保存在項目加載器中(但尚未分配給項目)。
  2. 數(shù)據(jù)來自 ?xpath2? 提取并通過 輸入處理器 用于(1)。輸入處理器的結(jié)果將附加到(1)中收集的數(shù)據(jù)(如果有)中。
  3. 這種情況與以前的情況類似,只是數(shù)據(jù)是從 ?css? 并通過相同的 輸入處理器 用于(1)和(2)。輸入處理器的結(jié)果將附加到(1)和(2)中收集的數(shù)據(jù)(如果有)中。
  4. 這種情況也與前面的情況類似,只是要收集的值是直接分配的,而不是從xpath表達式或css選擇器中提取的。但是,該值仍然通過輸入處理器傳遞。在這種情況下,由于該值不可重設(shè),因此在將其傳遞給輸入處理器之前,它將轉(zhuǎn)換為單個元素的可重設(shè)值,因為輸入處理器始終接收可重設(shè)值。
  5. 步驟(1)、(2)、(3)和(4)中收集的數(shù)據(jù)通過 輸出處理器 的 ?name? 字段。輸出處理器的結(jié)果是分配給 ?name? 項目中的字段。

值得注意的是,處理器只是可調(diào)用的對象,它們與要解析的數(shù)據(jù)一起調(diào)用,并返回已解析的值。所以你可以使用任何函數(shù)作為輸入或輸出處理器。唯一的要求是它們必須接受一個(而且只有一個)位置參數(shù),這將是一個iterable。

在 2.0 版更改: 處理器不再需要是方法。

注解

輸入和輸出處理器都必須接收iterable作為其第一個參數(shù)。這些函數(shù)的輸出可以是任何東西。輸入處理器的結(jié)果將被附加到一個內(nèi)部列表中(在加載程序中),其中包含收集的值(對于該字段)。輸出處理器的結(jié)果是最終分配給項目的值。

您需要記住的另一件事是,輸入處理器返回的值在內(nèi)部收集(在列表中),然后傳遞給輸出處理器來填充字段。

最后,但并非最不重要, itemloaders 有一些 commonly used processors 內(nèi)置方便。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號