2012-06-25 14 views
21

Estoy raspando algunos datos con información jerárquica compleja y necesito exportar el resultado a json.cómo implementar un elemento anidado en scrapy?

que definen los elementos que

class FamilyItem(): 
    name = Field() 
    sons = Field() 

class SonsItem(): 
    name = Field() 
    grandsons = Field() 

class GrandsonsItem(): 
    name = Field() 
    age = Field() 
    weight = Field() 
    sex = Field() 

y cuando la araña corre completa, voy a tener una salida de artículo impreso como

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

pero cuando corro scrapy crawl myscaper -o a.json, siempre dice que el resultado " no es JSON serializable ". Luego copio y pego el resultado del elemento en la consola ipython y uso json.dumps(), funciona bien. Entonces, ¿dónde está el problema? esto está impulsando mis nueces ...

Respuesta

2

No estoy seguro de si hay una manera de hacer los elementos anidados en fragmentación con las clases pero las matrices funcionan bien. Se podría hacer algo como esto:

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

Al guardar los elementos anidados, asegúrese de envolverlos en una llamada a dict(), ej .:

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)] 
+0

Sir, que se merece una galleta! –

Cuestiones relacionadas