Scrapy(Python) - 跳过网站部分

时间:2016-03-30 21:04:31

标签: python scrapy web-crawler

我正在开发网络抓取工具,从商店的网站https://www.promocje.zabka.pl收集数据。 有时,产品没有以正常方式附加价格(即跨度“产品 - 价格 - 整数”)。由于阵列的大小不同,它会在循环中引起麻烦。我可以将迭代限制为最短数组的长度,但它可能会扭曲结果(移位)。 这是我的问题:我怎样才能跳过产品的整个div,其中一个字段(价格整数,价格小数)为空或不存在?

这是我的代码(请注意,通常不需要金额,因为我可以从产品名称中提取更准确的值;这就是if的原因)

class MySpider(BaseSpider):
    name        = "zabka"
    allowed_domains = ["zabka.pl"]
    start_urls  = ["http://promocje.zabka.pl"]

    def parse(self, response):
        hxs     = HtmlXPathSelector(response)
        titles  = hxs.select('//div[@class="product-description"]/h2/text()').extract()
        prices  = hxs.select('//span[@class="product-price-integer"]/text()').extract()
        prices1 = hxs.select('//span[@class="product-price-decimal"]/text()').extract()
        amounts = hxs.select('//p[@class="product-unit"]/text()').extract()

        list = []

        for i in range(len(titles)):
            split = titles[i].split(",")
            if len(split) > 1:
                list1 = split[0] + "  -  " + prices[i] + "," + prices1[i] + "  -  " + split[len(split) - 1]
            else:
                list1 = titles[i] + "  -  " + prices[i] + "," + prices1[i] + "  -  " + amounts[i]
            list.append(list1)

        for l in list:
            item = NettutsItem()
            item["title"] = l
            yield item

1 个答案:

答案 0 :(得分:0)

我试过

scrapy shell http://promocje.zabka.pl/

主要思想是你应该使用div作为下一个选择器的起点。

In [32]: div  = response.xpath('//div[@class="product-description"]')[0]
In [33]: div.css('h2::text').extract()
Out[33]: [u'Babka marmur Dan Cake, 40 g']

In [34]: div.css('span[class="product-price-integer"]::text').extract()
Out[34]: [u'1']

尝试这种方法

def parse(self, response):
list = []
for div in response.xpath('//div[@class="product-description"]'):
    price = div.css('span[class="product-price-integer"]::text').extract()
    price1 = div.css('span[class="product-price-decimal"]::text').extract()
    title = div.css('h2::text').extract()[0].split(",")
    amount = div.css('p[class="product-unit"]::text').extract()[0]

    if price and price1:
        price = price[0]
        price1 = price1[0]
        item = NettutsItem()
        # do some stuff with item
        yield item

代码可能更漂亮。