Итерируйте части результатов для построения JSON без списков - PullRequest
0 голосов
/ 03 декабря 2018

Я создаю паука с помощью Scrapy - и, очевидно, мне не хватает моих навыков в Python.

Я хотел бы создать JSON полностью без списков, но, так как страница, которую я копирую, имеет несколько«типы комнат» для одного «названия комнаты» - я получаю списки.

Теперь этот код ...:

def parse(self, response):
    for romtyper in response.selector.xpath(".//div[@class='room__collapsable']"):
            fradato = romtyper.xpath("//input[@type='hidden' and @name='fromDate']/@value").extract_first()
            personer = romtyper.xpath("//*[@id='booking-widget-guest-count-hotelnav-widget']/span/ng-pluralize/text()").extract_first()
            romnavn = romtyper.xpath(".//h2[@class='room__heading-level1']/text()[1]").extract_first()

            for prisboks in response.selector.xpath(".//div[@class='room__rates l-price-box l-price-box--selectable']"):
                romtype = prisboks.xpath(".//h3[@class='room-price-info__rate']/text()").extract_first()
                rompris = prisboks.xpath(".//span[@class='price']/text()").extract_first()
                yield {"fradato": fradato, "personer": personer, "romnavn": romnavn, "romtype": romtype, "rompris": rompris}

... предоставляет мне только один из типов номеров (и цены).И если я перейду к extract () вместо extract_first () в строке -1 и -2 (снизу), я получу списки снова.

Вот результат, который я ищу:

[
{"fradato": "2018-12-03", "personer": "1 Voksen", "romnavn": "A room name", "romtype": "Room type A", "rompris": "1088 "}, 
{"fradato": "2018-12-03", "personer": "1 Voksen", "romnavn": "A room name", "romtype": "Room type B", "rompris": "1288 "}]

Спасибо за помощь новичку с основами ...

1 Ответ

0 голосов
/ 03 декабря 2018

Попробуйте:

def parse(self, response):
     formsel = response.css('form[name=bookingWidget]')
     fradato = formsel.css('input[name=fromDate]::attr(value)').get()
     personer = formsel.css('input[name="room[0].adults"]::attr(value)').get()
     for room in response.css('div.room__collapsable'):
        romnavn = room.css('h2::text').get()
        for prisboks in room.css('div.room-price-info '):
            romtype = prisboks.css('h3::text').get()
            rompris = prisboks.css('span.price::text').get()
            if not romtype or not rompris:
                continue
            yield {"fradato": fradato, "personer": personer, "romnavn": romnavn, "romtype": romtype, "rompris": rompris}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...