2012-06-25 14 views
21

मैं जटिल पदानुक्रमित जानकारी के साथ कुछ डेटा स्क्रैप कर रहा हूं और परिणाम जेसन को निर्यात करने की आवश्यकता है।स्केपर में नेस्टेड आइटम को कैसे कार्यान्वित करें?

मैं

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 serializable नहीं है "। फिर मैं आइटम आउटपुट को आईपीथॉन कंसोल में कॉपी और पेस्ट करता हूं और json.dumps() का उपयोग करता हूं, यह ठीक काम करता है। तो समस्या कहां है? यह मेरे पागल चला रहा है ...

उत्तर

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 
21

जब नेस्टेड आइटम बचत, उन्हें एक कॉल में रैप करने के लिए 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)] 
+0

सर, आप एक कुकी लायक! –

संबंधित मुद्दे