我正在开发网络抓取工具,从商店的网站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
答案 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
代码可能更漂亮。