Подтвердить что ты не робот

Как реализовать вложенный элемент в 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(), он отлично работает. Так где же проблема? это заставляет мои орехи...

4b9b3361

Ответ 1

При сохранении вложенных элементов обязательно заверните их в вызов 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)]

Ответ 2

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

grandson['name'] = 'Grandson'
grandson['age'] = 2
gransons.append(grandson)
son['name'] = 'Son'
sons['grandson'] = grandsons
sons.append(son)
item.name = 'Name'
item.son = sons