首页 > 解决方案 > 当网页响应(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]

标签: pythonweb-scrapingscrapy

解决方案


如果页面上有三个元素,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)

推荐阅读