2012-06-25 13 views
21

Sto raschiando alcuni dati con informazioni gerarchiche complesse e ho bisogno di esportare il risultato in json.come implementare l'elemento annidato in scrapy?

ho definito gli elementi come

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

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

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

e quando il ragno corre completa, mi metterò un'uscita oggetto stampata come

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

ma quando corro scrapy crawl myscaper -o a.json, si dice sempre il risultato " non è serializzabile JSON ". Quindi copio e incollo l'output dell'elemento nella console ipython e uso json.dumps(), funziona perfettamente. Quindi dove si trova il problema? questo mi sta facendo impazzire ...

risposta

2

Non so se c'è un modo per fare gli oggetti annidati in scrappy con le classi ma gli array funzionano bene. Si potrebbe fare qualcosa di simile:

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

Quando si salvano gli elementi nidificati, assicurarsi di metterli in una chiamata a dict(), ad es .:

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, vi meritate un biscotto! –