Я создаю паука с помощью 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 "}]
Спасибо за помощь новичку с основами ...
Один из советов - сделать словарь из ваших элементов, а затем преобразовать его в json. Для справки: stackoverflow.com/questions/51526076/…
не уверен, что ты хочешь? какие результаты вы получаете сейчас? пожалуйста, покажите нам ... вы выводите результаты с помощью Python FEED? вроде scrapy crawl spider -o test.json ??? или где вы хотите результатов?
HTML здесь -> ссылка на сайт и результаты, которые я получаю здесь -> ссылка на сайт Да, вывод именно такой, как вы предлагаете, Umair.






Пытаться:
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? @ Елена Ш.
Вы хотите, чтобы я переписал свое решение? Я думаю, что css короче и удобнее для чтения.
Нет - ваше решение просто отлично, Елена :-). Я уверен, что смог бы справиться с этим и сам, если бы захотел. Мне просто было любопытно. Согласен, читать легче. Еще раз спасибо!!
Я попытался немного реструктурировать, чтобы он уместился в моем MongoDb, но по какой-то причине этот код предоставляет только последний элемент в «комнате» и последний элемент в «присбоксах». Вы видите очевидную ошибку? -> ссылка на сайт @Elena
Да, ваш yield item находится за пределами надлежащего цикла @Jonas__G
Ах. Иногда я просто хочу убить себя. Спасибо за терпение, @Elena ... Хорошего дня!
Не могли бы вы показать страницу html, пожалуйста?