2014-04-08 1 views
3

Я прочесываю несколько предметов от this site, но он захватывает предметы только с первого продукта и не зацикливается дальше. Я знаю, что делаю простую глупую ошибку, но если вы можете просто указать, где я ошибся, я буду признателен.Не удается получить дополнительные товары с URL-адресом

Вот паук:

from scrapy.item import Item, Field 
from scrapy.spider import BaseSpider 
from scrapy.selector import Selector 
import re 

from zoomer.items import ZoomerItem 


class ZoomSpider(BaseSpider): 
    name = "zoomSp" 
    allowed_domains = ["zoomer.ge"] 
    start_urls = [ 
     "http://zoomer.ge/index.php?cid=35&act=search&category=1&search_type=mobile" 
    ] 

    def parse(self, response): 
     sel = Selector(response) 
     titles = sel.xpath('//div[@class="productContainer"]/div[5]') 
     items = [] 
     for t in titles: 
      item = ZoomerItem() 
      item["brand"] = t.xpath('//div[@class="productListContainer"]/div[3]/text()').re('^([\w, ]+)') 
      item["price"] = t.xpath('//div[@class="productListContainer"]/div[4]/text()').extract()[0].strip() 
      item["model"] = t.xpath('//div[@class="productListContainer"]/div[3]/text()').re('\s+(.*)$')[0].strip() 

      items.append(item) 

     return(items) 

P.S. Также не может получить регулярное выражение для строки «brand», чтобы получить только первое слово «Blackberry» из строки:

«BlackBerry P9981 Porsche Design».

ответ

3

Элемент с классом productContainer представляет собой контейнер и появляется только один раз, при этом он не повторяется. Повторяющийся элемент, который вы хотите перебрать, - это класс с классом productListContainer.

def parse(self, response): 
    sel = Selector(response) 
    titles = sel.xpath('//div[@class="productContainer"]/div[5]/div[@class="productListContainer"]') 
    items = [] 
    for t in titles: 
     item = ZoomerItem() 
     item["brand"] = t.xpath('div[3]/text()').re('^([\w\-]+)') 
     item["price"] = t.xpath('div[@class="productListPrice"]/div/text()').extract() 
     item["model"] = t.xpath('div[3]/text()').re('\s+(.*)$')[0].strip() 
     items.append(item) 

     items.append(item) 

    return(items) 

Эта функция не проверена, поскольку я не являюсь участником python, поэтому вам, возможно, придется немного поиграть.

+0

Извинения за изменение; Я ожидал, что он потребует одобрения перед обновлением. :( – Talvalin

+0

@ Talvalin не волнуется, я рад, когда вы исправляете мои ошибки :) Я действительно не знаю, что такое scrapy, так что теперь это не XPath 1.0. Тем не менее, я повторно отредактировал часть о 'string()', поскольку это похоже на XPath 1.0: http://www.w3.org/TR/xpath/#function-string – dirkk

+0

Я должен был также отметить, что я проверил код с помощью scrapy, и я получаю ошибку Invalid XPath, если вместо 'text()' используется 'string()' – Talvalin

Смежные вопросы