2013-10-31 70 views
3

使用scrapy的python腳本,scrapy從網站上抓取數據,將其分配給3個字段,然後生成一個.csv。工作正常,但有一個主要問題。所有字段都包含所有的數據,而不是爲每個表格行分離出來。我敢肯定,這是由於我的循環不工作,當它發現它只是抓住每一行中的所有數據移動到獲取數據的其他2場,而不是創建單獨的行創建循環來解析scrapy/python中的表數據

def parse(self, response): 
    hxs = HtmlXPathSelector(response) 
    divs = hxs.select('//tr[@class="someclass"]') 
    for div in divs: 
     item = TestBotItem() 
     item['var1'] = div.select('//table/tbody/tr[*]/td[2]/p/span[2]/text()').extract() 
     item['var2'] = div.select('//table/tbody/tr[*]/td[3]/p/span[2]/text()').extract() 
     item['var3'] = div.select('//table/tbody/tr[*]/td[4]/p/text()').extract() 
     return item 
前的XPath

帶*的tr隨着我需要爬行的網站上的每個條目而增加,另外兩條路徑插入下方。我該如何編輯它,以便抓取say // table/tbody/tr [3]的第一組數據,將它存儲在所有三個字段中,然後移動到// table/tbody/tr [4]等? ?

更新

正常工作,但是我想一些驗證添加到pipelines.py文件將降大任記錄,其中Var1爲100%以上。我確定我的代碼在下面是錯誤的,並且「yield」而不是「return」會停止正在使用的管道?

from scrapy.exceptions import DropItem 

class TestbotPipeline(object): 
def process_item(self, item, spider): 
    if item('var1') > 100%: 
     return item 
    else: 
     raise Dropitem(item) 

回答

5

我認爲這是你在找什麼:

def parse(self, response): 
    hxs = HtmlXPathSelector(response) 
    divs = hxs.select('//tr[@class="someclass"]') 
    for div in divs: 
     item = TestBotItem() 
     item['var1'] = div.select('./td[2]/p/span[2]/text()').extract() 
     item['var2'] = div.select('./td[3]/p/span[2]/text()').extract() 
     item['var3'] = div.select('./td[4]/p/text()').extract() 

     yield item 

tr·您循環,然後使用相對XPath表達式(),並在每次迭代中使用yield指令。

你也可以每個項目追加到一個列表,並返回該列表循環外)這樣的(這等同於上面的代碼):

def parse(self, response): 
    hxs = HtmlXPathSelector(response) 
    divs = hxs.select('//tr[@class="someclass"]') 
    items = [] 

    for div in divs: 

     item = TestBotItem() 
     item['var1'] = div.select('./td[2]/p/span[2]/text()').extract() 
     item['var2'] = div.select('./td[3]/p/span[2]/text()').extract() 
     item['var3'] = div.select('./td[4]/p/text()').extract() 

     items.append(item) 

    return items 
+0

完美的作品 –

+0

,如果你能告訴我怎麼追加到循環,這將有助於爲我現在正在試圖收集更多的數據之外的列表。我試圖在「pipelines.py」中寫入一些驗證,但它似乎忽略它並輸出所有數據,即使是與條件不匹配的數據。 –

+0

我用循環之外返回的項目列表更新了我的答案。您可能應該在一些pastebin服務中與您分享蜘蛛和管道代碼,供我們檢查。另外,在'div'的循環中,確保你使用**相對的XPath表達式**,例如'./td [2]/p/span [2]/text()'和**不是絕對**像'// td [2]/p/span [2]/text() –

2

你不需要HtmlXPathSelector。 Scrapy已經有內置的XPATH選擇器。試試這個:

def parse(self, response): 
    divs = response.xpath('//tr[@class="someclass"]') 
    for div in divs: 
     item = TestBotItem() 
     item['var1'] = div.xpath('table/tbody/tr[*]/td[2]/p/span[2]/text()').extract()[0] 
     item['var2'] = div.xpath('table/tbody/tr[*]/td[3]/p/span[2]/text()').extract()[0] 
     item['var3'] = div.xpath('table/tbody/tr[*]/td[4]/p/text()').extract()[0] 
     return item