python - 当网页响应(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]
解决方案
如果页面上有三个元素,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)
推荐阅读
- swift - 如何在 Swift 中摆脱 Objective-C 的 KVO?
- javascript - javascript onclick 更改 mp3 播放器
- numpy - 调整 numpy 图像数组的大小
- python - 如何修复索引 4 超出轴 0 大小为 4 的范围?
- server-side-rendering - ReferenceError:在角度 9 中运行 SSR 时未定义窗口
- r - R:从混合数字和字母的字符串中提取最大数字
- javascript - 如何在不使用 nativeElement 的情况下自动聚焦 Angular 10 中的表单控件
- laravel - NGINX 和 Laravel - 带有特殊字符的 json 发布请求
- python - AttributeError: 'WebElement' object has no attribute 'get_text' 使用 Selenium Python 提取开始和结束标记之间的文本时出错
- javascript - 如何从 react 和 firebase 为每个用户创建用户页面