2012-06-25 25 views
21

Tôi đang cạo một số dữ liệu với thông tin phân cấp phức tạp và cần xuất kết quả thành json.làm cách nào để triển khai mục lồng nhau trong trường hợp cồng kềnh?

tôi xác định các mặt hàng như

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

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

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

và khi nhện chạy hoàn tất, tôi sẽ nhận được một sản lượng hàng in như

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

nhưng khi tôi chạy scrapy crawl myscaper -o a.json, nó luôn luôn nói rằng kết quả " không phải là JSON có thể tuần tự hóa ". Sau đó, tôi sao chép và dán mục đầu ra vào giao diện điều khiển ipython và sử dụng json.dumps(), nó hoạt động tốt. Vậy đâu là vấn đề? đây là lái xe hạt của tôi ...

Trả lời

2

Không chắc chắn nếu có một cách để làm các mục lồng nhau trong scrappy với các lớp học nhưng mảng làm việc tốt. Bạn có thể làm một cái gì đó như thế này:

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

Khi lưu các mục lồng nhau, hãy chắc chắn để bọc chúng trong một cuộc gọi đến Dict(), ví dụ .:

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, bạn xứng đáng một cookie! –

Các vấn đề liên quan