2017-02-27 3 views
0

Ich lerne scrapy aus irgendeinem Grund, es gibt nur das erste Element auf der Seite zurück. Kann mir jemand sagen, was ich falsch mache?scrapy ersten Artikel zurückgeben

Unten ist der Code, den ich habe:

class RuvillaSpider(Spider): 

    name = "RuvillaSpider" 
    allowded_domains = ["ruvilla.com"] 
    start_urls = ["https://www.ruvilla.com/men/footwear.html?dir=desc&limit=45&order=news_from_date"] 

    def parse(self, response): 
     products = Selector(response).xpath('//div[@class="category-products"]') 

     if not products: 
      raise CloseSpider('RuvillaSpider: DONE, NO MORE PAGES.') 

     for product in products: 
      item = RuvillaItem() 
      item['name'] = product.xpath('ul/li/div/div[1]/a/@title').extract()[0] 
      item['link'] = product.xpath('ul/li/div/div[1]/a/@href').extract()[0] 
      item['image'] = product.xpath('ul/li/div/div[1]/a/img/@src').extract()[0] 
      yield item 
+0

Hier auseinander Ihre Klasse von der Definition, Sie sind * a priori * nichts falsch machen. Was Sie mit der Instanz dieser Klasse tun, kann ebenfalls hilfreich sein. Dies könnte uns zum Beispiel zeigen, dass Sie wissen, dass Sie einen Generator verwenden. – Kanak

Antwort

0

Ihre XPath scheint für products Variable nur 1 Produkt zurückzukehren.

Versuchen:.

$ scrapy shell "https://www.ruvilla.com/men/footwear.html?dir=desc&limit=45&order=news_from_date" 
In[1]: response.xpath('//div[@class="category-products"]') 
Out[1]: [<Selector xpath='//div[@class="category-products"]' data=u'<div class="category-products">\n<div cla'>] 

So ist es Ihre XPath scheint nicht für jeden einzelnen Artikel ist aber für den Container die Einzelteile sind hier Abhilfe zu schaffen Sie benötigen einen XPath zu erzeugen, die jedes Produkt Behälter statt wählen :

def parse(self, response): 
    products = Selector(response).xpath('//div[@class="category-products"]//li[contains(@class,"item")]') 

    for product in products: 
     item = dict() 
     item['name'] = product.xpath('.//a/@title').extract_first() 
     item['link'] = product.xpath('.//a/@href').extract_first() 
     item['image'] = product.xpath('.//a/img/@src').extract_first() 
     yield item 
    next_page = response.xpath("//li[@class='current']/following-sibling::li[1]/a/@href").extract_first() 
    if next_page: 
     yield Request(next_page) 
0

Ihr Xpath war falsch.

verwenden XPath:

('// div [@ class = "Kategorie-Produkte"]/ul/li')

Verwandte Themen