2013-09-25 72 views
1

什麼是從網頁提取物品信息的最佳安全方式? 我的意思是,有時候頁面中可能缺少一件物品,最終你會破壞抓取工具。Scrapy安全地提取物品

看看這個例子:

for cotacao in tabela_cotacoes: 
     citem = CotacaoItem() 
     citem['name'] = cotacao.select("td[4]/text()").extract()[0] 
     citem['symbol'] = cotacao.select("td/a/b/text()").extract()[0] 
     citem['current'] = cotacao.select("td[6]/text()").extract()[0] 
     citem['last_neg'] = cotacao.select("td[7]/text()").extract()[0] 
     citem['oscillation'] = cotacao.select("td[8]/text()").extract()[0] 
     citem['openning'] = cotacao.select("td[9]/text()").extract()[0] 
     citem['close'] = cotacao.select("td[10]/text()").extract()[0] 
     citem['maximum'] = cotacao.select("td[11]/text()").extract()[0] 
     citem['minimun'] = cotacao.select("td[12]/text()").extract()[0] 
     citem['volume'] = cotacao.select("td[13]/text()").extract()[0] 

如果某些項目在頁面丟失,.extract()將返回[]和調用[0]他們將拋出一個異常(超出範圍)。

所以問題是,處理這個問題的最佳方式是什麼?

+0

單獨的問題,但我會做一個並行列表,而不是鍵入(或複製)所有功能10次。 'Fields = ['name','current','last_neg'...]; Nums = [4,6,7 ...]'它們通過MyField循環,myNum以zip(Fields,Nums):citem [MyField] = cotacao ... [MyNum] ...'然後你可以做到這一點只有一個循環... – beroe

回答

2

撰寫小助手功能:

def extractor(xpathselector, selector): 
    """ 
    Helper function that extract info from xpathselector object 
    using the selector constrains. 
    """ 
    val = xpathselector.select(selector).extract() 
    return val[0] if val else None 

而且使用這樣的:

citem['name'] = extractor(cotacao, "td[4]/text()") 

返回一個適當的值指示citem沒有被發現。在我的代碼中,我返回None,必要時進行更改(例如,如果有意義,則返回'')。

+0

我擔心我不得不在每一行上進行驗證,並且過於冗長。使用輔助函數保持乾淨,這很好。這是您在項目中使用的解決方案?感謝您的回覆。 – Medeiros

+0

@Medeiros是的,沒錯。我總是使用大量的小幫手程序進行驗證等。我不喜歡把事情過於冗長:) –

+0

當然,在接受之前,我總是會有一些方式,因爲討論可能會增長並需要調整問題和/或答案。每個人都贏了。 :) – Medeiros