Классифицируйте соскобленные результаты рядом в ряд - PullRequest
0 голосов
/ 05 июня 2018

Итак, я использую python / scrapy для очистки данных с веб-страницы.В основном веб-страница состоит из 15 блоков, которые содержат различную информацию.Мой паук повторяет каждый блок, чтобы очистить какой-то конкретный контент.Я доволен содержанием результатов, но не тем, как представлены данные.Я хочу, чтобы вся извлеченная информация, принадлежащая одному блоку, была представлена ​​в одной строке.На скриншоте ниже вы увидите, что результаты одного и того же блока не представлены рядом, что я и хочу.

def parse(self, response):
    for i in response.css('span.dir'):
        yield {'address': i.css('b::text').extract()}
    for l in response.css('div.datos'):
        yield {'area': l.css('i::text').extract()}
    for x in response.css('div.opciones'):
        yield {'price stable': x.css('span.eur::text').extract()}
    for o in response.css('div.opciones'):
        yield {'price drop': o.css('div.mp_pvpant.baja::text').extract()}
    for y in response.css('div.opciones'):
        yield {'price decreased': y.css('span.eur_m::text').extract()}
    for u in response.css('div.datos'):
        yield {'link': u.css('a::attr(href)').extract_first()}

Results of scrapy

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Если в каждой строке одинаковое количество результатов, вы можете сделать это:

def parse(self, response):
    addresses = []
    areas = []
    prices_stable = []
    prices_drop = []
    prices_decreased = []
    links = []
    for i in response.css('span.dir'):
        addresses.append(i.css('b::text').extract())
    for l in response.css('div.datos'):
        areas.append(l.css('i::text').extract())
    for x in response.css('div.opciones'):
        prices_stable.append(x.css('span.eur::text').extract())
    for o in response.css('div.opciones'):
        prices_drop.append(o.css('div.mp_pvpant.baja::text').extract())
    for y in response.css('div.opciones'):
        prices_decreased.append(y.css('span.eur_m::text').extract())
    for u in response.css('div.datos'):
        links.append(u.css('a::attr(href)').extract_first())

    for address, area, price_stable, price_drop, price_decreased, link in zip(addresses, areas, prices_stable, prices_drop, prices_decreased, links):
        yield {
            'address': address,
            'area': area,
            'price_stable': price_stable,
            'price_drop': price_drop,
            'price_decreased': price_decreased,
            'link': link,
        }
0 голосов
/ 06 июня 2018

Вы можете добавить извлеченные значения в список, а затем выдать то же самое, например:

def parse(self, response):
    # create more lists for the remaining fields
    address = []
    area = []
    for i in response.css('span.dir'):
        address.append(i.css('b::text').extract())
    yield {'address':address}
    for l in response.css('div.datos'):
        area.append(l.css('i::text').extract())
    yield {'area':area}
...