在练习网页抓取如何抓取电子商务网站的过程中,我想抓取所有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]
答案 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])