Scrapy / игнорировать пустые предметы - PullRequest
0 голосов
/ 30 октября 2018

Я создал этого маленького бота, который обрабатывает список параметров поиска. Работает нормально, пока на странице нет нескольких результатов: product_prices_euros дает список элементов, половина из которых пуста. Поэтому, когда я объединяю с product_prices_cents, у меня есть вывод, подобный следующему:

  'price' : '',76 

для половины результатов. Есть ли простой способ предотвратить сбор пустых предметов? Мой вывод для product_prices_euros выглядит так:

[' 1', ' ', ' 2', ' ', ' 2', ' ', ' 1', ' ', ' 1', ' ', ' 1', ' ', ' 2', ' ']

Я бы хотел оставить только «1», «2» и т. Д. *

Вот что выглядит как CSS. На этой стороне может быть что-то:

< span class="product-pricing__main-price" >
2 
< span class="cents" >,79€< /span >
< /span >

И мой код:

def start_requests(self):
    base_url="https://new.carrefour.fr/s?q="
    test_file = open(r"example", "r")
    reader = csv.reader(test_file)
    for row in reader:
        if row:
            url = row[0]
            absolute_url = base_url+url
            print(absolute_url)
            yield scrapy.Request(absolute_url, meta={'dont_redirect': True, "handle_httpstatus_list": [302, 301]}, callback=self.parse)


def parse(self, response):
    product_name = response.css("h2.label.title::text").extract()
    product_packaging = response.css("div.label.packaging::text").extract()
    product_price_euros = response.css("span.product-pricing__main-price::text").extract()
    product_price_cents = response.css("span.cents::text").extract()
    for name, packaging, price_euro, price_cent in zip(product_name, product_packaging, product_price_euros, product_price_cents):
            yield { 'ean' : response.css("h1.page-title::text").extract(), 'name': name+packaging, 'price': price_euro+price_cent}

Есть идеи? :)

Ответы [ 2 ]

0 голосов
/ 04 ноября 2018

Если вы просто отфильтруете пустые элементы евро , как вы можете сопоставить их с их центами ?

Во-первых, ИМХО, я думаю, было бы проще, если бы вы перебрали товары, чтобы собрать их данные. Например.

for product in response.css('.product-list__item'):
    name = product.css("h2.label.title::text").extract()
    # ...

Таким образом, вы можете получить цены и центы так:

>>> product.css('.product-pricing__main-price  ::text')
['2', ',99€']

>>> ''.join(product.css('.product-pricing__main-price  ::text').getall())
'2,99€'
0 голосов
/ 30 октября 2018

В конце концов вы можете отфильтровать свой список по нежелательным вхождениям:

list(filter(lambda a: a != '', yourList))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...