当网页回应中没有找到任何类别时(Scrapy),如何将文字值填为零?

时间:2019-02-09 09:07:46

标签: python web-scraping scrapy

在练习网页抓取如何抓取电子商务网站的过程中,我想抓取所有4种产品的信息价格和产品页面的折扣,但是对于一种产品有折扣类,它只检索三个值而不是四折优惠。在缺少班级的情况下,如何为折扣填充空值或零值?

<div class="prd_p_section">
    <div class="ori_price">
        <span class="p_price">Rs.23899</span>
        <span class="prd_discount">20% Off</span>                            
     </div>
     <div class="old_prices">                                                                        
         <span>Rs 28999</span>
         <span>Rs 29999</span>                                                                                  
      </div>
      <div class="multi_tags_pl">
      </div>                          
</div>
.
.
.
.
.
.
<div class="prd_p_section">
    <div class="ori_price">
        <span class="p_price">Rs.11590</span>                            
     </div>
     <div class="old_prices">                                                                        
         "
         "                                                                                  
      </div>
      <div class="multi_tags_pl">
    </div>                          
</div>

我的代码:

In [47]: fetch('https://www.shopclues.com/big-battery-smartphones.html')
In [45]: response.css('.p_price::text').extract()
Out[45]: ['Rs.23899', 'Rs.23899', 'Rs.43999', 'Rs.11590']

In [46]: response.css('.prd_discount::text').extract()
Out[46]: ['20% Off', '19% Off', '27% Off']

预期结果:

In [45]: response.css('.p_price::text').extract()
Out[45]: ['Rs.23899', 'Rs.23899', 'Rs.43999', 'Rs.11590']

In [46]: response.css('.prd_discount::text').extract()
Out[46]: ['20% Off', '19% Off', '27% Off', 0]

2 个答案:

答案 0 :(得分:1)

如果页面上有三个元素,则scrapy将返回三个元素,而不是四个。因此,我想您要对抓取的数据进行后期处理。例如,您可以尝试使用itertools.izip_longest,它使您可以合并长度不等的数组。这是一个示例:

import itertools

prices = ['Rs.23899', 'Rs.23899', 'Rs.43999', 'Rs.11590']
discounts = ['20% Off', '19% Off', '27% Off']
for i in itertools.izip_longest(prices, discounts):
    print i

这将输出您:

('Rs.23899', '20% Off')
('Rs.23899', '19% Off')
('Rs.43999', '27% Off')
('Rs.11590', None)

答案 1 :(得分:0)

例如,如果您的方法将错误地抓取数据,则该页面包含4个产品,而第二个产品没有折扣(例如,上一个不是最后一个)。
您的response.css('.prd_discount::text').extract()结果不表示有4个产品中的确切1个没有折扣选项。
我建议在页面的每个项目部分分别添加价格/折扣数据:

data = []
for item_container in response.css("div.prd_p_section"):
    price = item_container.css(".p_price::text").extract_first()
    discount = item_container.css(".prd_discount::text").extract_first()
    data.append([price,discount])