python - example - ¿Cómo implementar un elemento anidado en scrapy?
scrapy tutorial (2)
Al guardar los elementos anidados, asegúrese de envolverlos en una llamada a dict (), por ejemplo:
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)]
Estoy raspando algunos datos con información jerárquica compleja y necesito exportar el resultado a json.
Definí los artículos como
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 se ejecute, obtendré una salida del 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 ejecuto scrapy crawl myscaper -o a.json
, siempre dice que el resultado "no es JSON serializable". Luego copio y pego la salida del elemento en la consola ipython y uso json.dumps (), funciona bien. Entonces, ¿dónde está el problema? esto me está volviendo loco ...
No estoy seguro de si hay una manera de hacer elementos anidados en scrappy con clases pero los arreglos funcionan bien. Podrías 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