26

複雑な階層情報を含むデータをスクレイピングしており、結果を json にエクスポートする必要があります。

アイテムを次のように定義しました

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 シリアライズ可能ではありません」と表示されます。次に、アイテムの出力をコピーして ipython コンソールに貼り付け、json.dumps() を使用すると、正常に動作します。問題はどこにあるのでしょうか? これは私のナッツを運転しています...

4

2 に答える 2

34

ネストされたアイテムを保存するときは、必ず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)]
于 2012-12-19T02:27:44.807 に答える
2

クラスを使用してスクレイピーでネストされたアイテムを実行する方法があるかどうかはわかりませんが、配列は正常に機能します。次のようなことができます。

grandson = Grandson(name = 'Grandson', age = 2)

son = Son(name = 'Son', grandsons = [grandson])

item = Item(name = 'Name', son = [son])
于 2012-06-26T13:13:23.430 に答える