как реализовать вложенный элемент в scrapy?

Я очищаю некоторые данные со сложной иерархической информацией и должен экспортировать результат в json.

Я определил элементы как

class FamilyItem(): name = Field() sons = Field() class SonsItem(): name = Field() grandsons = Field() class GrandsonsItem(): name = Field() age = Field() weight = Field() sex = Field() 

и когда паук работает закончен, я получу распечатанный вывод, например

 {'name': 'Jenny', 'sons': [ {'name': u'S1', 'grandsons': [ {'name': u'GS1', 'age': 18, 'weight': 50 }, { 'name':u'GS2', 'age': 19, 'weight':51}] }] } 

но когда я запускаю scrapy crawl myscaper -o a.json , он всегда говорит, что результат «не является сериализуемым JSON». Затем я копирую и вставляю вывод элемента в консоль ipython и использую json.dumps (), он отлично работает. Так где же проблема? это заставляет мои орехи …

  • TypeError при отправке скребковых данных из scrapy в elasticsearch
  • Создание родового спайдера
  • Как остановить всех пауков и двигатель сразу после выполнения условия в конвейере?
  • Ошибка при создании проекта Scrapy через startproject
  • scrapy не может сканировать все ссылки на странице
  • Установка scrapy на mac-pyasn1 не найдена
  • Запуск нескольких пауков с использованием scrapyd
  • Как запустить поисковый робот автоматически?
  • 2 Solutions collect form web for “как реализовать вложенный элемент в scrapy?”

    При сохранении вложенных элементов обязательно заверните их в вызов dict (), например:

     gs1 = GrandsonsItem() gs1['name'] = 'GS1' gs1['age'] = 18 gs1['weight'] = 50 gs2 = GrandsonsItem() gs2['name'] = 'GS2' gs2['age'] = 19 gs2['weight'] = 51 s1 = SonsItem() s1['name'] = 'S1' s1['grandsons'] = [dict(gs1), dict(gs2)] jenny = FamilyItem() jenny['name'] = 'Jenny' jenny['sons'] = [dict(s1)] 

    Не уверен, что есть способ делать вложенные элементы в лоскутном с классами, но массивы работают нормально. Вы могли бы сделать что-то вроде этого:

     grandson['name'] = 'Grandson' grandson['age'] = 2 gransons.append(grandson) son['name'] = 'Son' sons['grandson'] = grandsons sons.append(son) item.name = 'Name' item.son = sons 
    Python - лучший язык программирования в мире.