2012-06-25 5 views
21

Ich kratze einige Daten mit komplexen hierarchischen Informationen und muss das Ergebnis nach json exportieren.Wie implementiert man verschachtelte Artikel in Scrapy?

I definiert die Einzelteile als

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

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

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

und wenn die Spinne vollständig läuft, werde ich eine gedruckte Artikel Ausgabe wie

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

bekommen, aber wenn ich scrapy crawl myscaper -o a.json laufen, es sagt immer das Ergebnis " ist nicht JSON serializable ". Dann kopiere ich und fügen Sie die Ausgabe des Elements in die ipython-Konsole und verwenden Sie json.dumps(), es funktioniert gut. Wo ist das Problem? das treibt meine Nüsse ...

Antwort

2

Nicht sicher, ob es eine Möglichkeit gibt, verschachtelte Elemente in Scrappy mit Klassen zu tun, aber Arrays funktionieren gut. Man könnte so etwas tun:

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

Wenn die verschachtelten Elemente zu speichern, stellen Sie sicher, sie in einem Aufruf umwickeln() dict, z.B .:

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, Sie verdienen ein Plätzchen! –

Verwandte Themen