Правильно расположив результаты двух циклов for - PullRequest
0 голосов
/ 13 мая 2018

Итак, как вы увидите из кода ниже, я собираю информацию со Scrapy. Все работает отлично, я просто не доволен тем, как хранятся очищенные данные. В текущем коде я получаю результаты в виде столбца «X» и столбца «Y» рядом (что нормально), но результаты для «U» отображаются в виде строки, поскольку они запускаются из второго петля. Так что я хотел бы, чтобы скрепленные данные располагались в трех столбцах рядом: X / Y / U. Кто-нибудь может помочь с этим? Заранее спасибо!

def parse(self, response):
    U = []
    for l in response.css('div.property-info-wrapper'):
        yield {
            'X': l.css('span.info-price::text').extract_first(),
            'Y': l.css('li::text').extract_first(),
        }

    for i in response.selector.xpath('//div[@class="property-info-location ellipsis-element-control"]/text()').extract():
        U.append(i)
    yield {'U':U}

1 Ответ

0 голосов
/ 13 мая 2018

Вы можете использовать itertools.zip_longest, чтобы сжать оба результата вместе и вывести их на основе значения Истины *.

from itertools import zip_longest

def parse(self, response):
    locations = response.selector.xpath('//div[@class="property-info-location ellipsis-element-control"]/text()').extract()
    css = response.css('div.property-info-wrapper')

    for loc, c in zip_longest(css, locations):
        if loc:
            yield {
                'X': loc.css('span.info-price::text').extract_first(),
                'Y': loc.css('li::text').extract_first(),
            }
        if c:
            yield {'U': c}  # since spider needs to return dict

* itertools.zip_longest (* iterables, fillvalue = None) : Создайте итератор, который объединяет элементы из каждого из итераций. Если итерации имеют неравную длину, пропущенные значения заполняются значением заполнения. Итерация продолжается до тех пор, пока не будет исчерпана самая длинная итерация.

...