Как заполнить текстовое значение нулем, если в ответе веб-страницы не найдено ни одного класса? - PullRequest
0 голосов
/ 09 февраля 2019

Практикуя очистку веб-страниц от работы с сайтом электронной коммерции, я хочу проанализировать информацию о цене и скидке для всех 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 голосов
/ 09 февраля 2019

Ваш подход будет неправильно обрабатывать данные, если, например: страница содержит 4 продукта и 2-й продукт без скидки (не последний, как в примере).
Ваш результат response.css('.prd_discount::text').extract() не указывает, какой именно 1 из4 товара - без скидки.
Предлагаю добавить данные о цене / скидке в каждом разделе страницы отдельно:

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])
0 голосов
/ 09 февраля 2019

Если на странице три элемента, скрап возвратит вам три элемента, а не четыре.Поэтому я полагаю, что вы используете постобработку очищенных данных.Например, вы можете попробовать использовать 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...