2016-02-13 169 views
2

scrapy很新穎,請耐心等待。Scrapy - 抓取多個物品

首先,這裏是我的代碼:

from scrapy.spider  import BaseSpider 
from scrapy.selector  import HtmlXPathSelector 
from usdirectory.items import UsdirectoryItem 
from scrapy.http import Request 


class MySpider(BaseSpider): 
    name   = "usdirectory" 
    allowed_domains = ["domain.com"] 
    start_urls = ["url_removed_sorry"] 

    def parse(self, response): 
     hxs  = HtmlXPathSelector(response) 
     titles  = hxs.select('//*[@id="holder_result2"]/a[1]/span/span[1]/text()').extract() 
     for title in titles: 
       item = UsdirectoryItem() 
       item["title"] = title 
       item 


     yield item 

這工作...但它只是抓住了第一個項目。

我注意到在我試圖抓取的項目中,每行的Xpath更改。例如,第一行是你看到上面的XPath:

//*[@id="holder_result2"]/a[1]/span/span[1]/text() 

然後遞增2,一路29.於是,第二個結果:

//*[@id="holder_result2"]/a[3]/span/span[1]/text() 

最後結果:

//*[@id="holder_result2"]/a[29]/span/span[1]/text() 

所以我的問題是如何讓腳本抓住所有這些,我不在乎我是否需要複製和粘貼每個項目的代碼。所有其他頁面都完全一樣。我只是不確定如何去做。

非常感謝。

編輯:

import scrapy 
from scrapy.item import Item, Field 

class UsdirectoryItem(scrapy.Item): 
    title = scrapy.Field() 
+1

這可能是你的問題的格式問題上的代碼,但一個問題是,「屈服項目」需要在裏面了「冠軍」循環。只有在「解析」結束時纔有一個收益,您只會得到1個項目 –

回答

0

讓我知道這對你的作品。注意我們正在遍歷[i]而不是[1]。結果存儲在一個列表中(希望)。

def parse(self, response): 
    hxs = HtmlXPathSelector(response) 

    for i in xrange(15): 
     titles = hxs.select('//*[@id="holder_result2"]/a[' + str(1+i*2) + ']/span/span[1]/text()').extract() 
     for title in titles: 
       item = UsdirectoryItem() 
       item["title"] = title 
       item #erroneous line? 
     items.append(item) 
     yield item 
+0

我收到了一大堆錯誤,但是我會玩弄代碼並查看是否可以使其工作。 – dkeeper09

+0

請不要使用未經測試的代碼提交答案,如果您不確定自己的代碼的功能,則無用。 '對於xrange(15)中的我''_not_ return' 1,3,5 ...'和'i'不在XPath字符串內插補。 –

+0

謝謝@ Mathias-Müller。沒有複製我的部分代碼。在我睡眠不足的狀態下,我也不知何故預計'我'被插入。 dkeeper09:你有東西在工作嗎? – weezilla

1

鑑於該模式是完全按照你描述的,你可以使用XPath modulo operatormod上的a位置索引來獲取所有目標a元素:

//*[@id="holder_result2"]/a[position() mod 2 = 1]/span/span[1]/text() 

對於一個快速演示,請考慮以下輸入XML:

<div> 
<a>1</a> 
<a>2</a> 
<a>3</a> 
<a>4</a> 
<a>5</a> 
</div> 

鑑於這個XPath /div/a[position() mod 2 = 1],以下內容會返回:

<a>1</a> 
<a>3</a> 
<a>5</a> 

見xpathtester.com現場演示here

+0

好吧,當我把這個XPath,它只抓住最後一個記錄,而不是之間的任何東西。想法? – dkeeper09

+1

@ dkeeper09問題幾乎可以肯定的是你不顯示你的輸入文件。 –

+0

確定檢查原來的帖子,看看你是否在尋找。 – dkeeper09