Итерируйте части результатов для создания JSON без списков

Я создаю паука с помощью 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 "}]

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

Не могли бы вы показать страницу html, пожалуйста?

vezunchik 03.12.2018 16:57

Один из советов - сделать словарь из ваших элементов, а затем преобразовать его в json. Для справки: stackoverflow.com/questions/51526076/…

Tony Montana 03.12.2018 17:06

не уверен, что ты хочешь? какие результаты вы получаете сейчас? пожалуйста, покажите нам ... вы выводите результаты с помощью Python FEED? вроде scrapy crawl spider -o test.json ??? или где вы хотите результатов?

Umair Ayub 03.12.2018 17:10

HTML здесь -> ссылка на сайт и результаты, которые я получаю здесь -> ссылка на сайт Да, вывод именно такой, как вы предлагаете, Umair.

Jonas__G 03.12.2018 17:11
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
4
46
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Пытаться:

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}

БЛАГОДАРНОСТЬ! Это действительно сработало. У меня еще не было времени проанализировать ваше решение (но я обязательно буду), но могу ли я спросить, вы предпочитаете css vs xpath? @ Елена Ш.

Jonas__G 03.12.2018 19:47

Вы хотите, чтобы я переписал свое решение? Я думаю, что css короче и удобнее для чтения.

vezunchik 03.12.2018 19:48

Нет - ваше решение просто отлично, Елена :-). Я уверен, что смог бы справиться с этим и сам, если бы захотел. Мне просто было любопытно. Согласен, читать легче. Еще раз спасибо!!

Jonas__G 03.12.2018 20:23

Я попытался немного реструктурировать, чтобы он уместился в моем MongoDb, но по какой-то причине этот код предоставляет только последний элемент в «комнате» и последний элемент в «присбоксах». Вы видите очевидную ошибку? -> ссылка на сайт @Elena

Jonas__G 05.12.2018 12:24

Да, ваш yield item находится за пределами надлежащего цикла @Jonas__G

vezunchik 05.12.2018 12:51

Ах. Иногда я просто хочу убить себя. Спасибо за терпение, @Elena ... Хорошего дня!

Jonas__G 05.12.2018 13:05

Другие вопросы по теме