2017-01-16 9 views
0

JSONレスポンスからデータをクロールしています。 forループを使用してアイテムにデータを抽出すると、このループによって作成されたすべての前のレコードを書き直す最後のレコードです。ここでScrapy - forループを使用してアイテムを追加するときに重複したアイテムを取得する

は私のコードです:

def parse_centers_and_ambulances(self, response): 
    json_response = json.loads(response.body_as_unicode()) 
    facility = MedFacilityItem() 
    facility["name"] = "Med Facility #1" 
    centers = [] 
    med_centers = MedCenterItem() 
    for center in json_response: 
     if center["name"].startswith("Center"): 
     med_centers["response_url"] = center["product_id"] 
     med_centers["name"] = center["name"] 
     med_centers["address"] = center["name_short"] + "." +  
               center["adr_name"] + " " + 
               center["adr_dom"] 
     med_centers["lat"] = center["latitude"] 
     med_centers["lon"] = center["longitude"] 
     med_centers["phoneInfo"] = [{"number": center["tel1"], 
            "description": center["tel1_descr"]}, 
            {"number": center["tel2"], 
            "description": center["tel2_descr"]}] 
     centers.append(med_centers) 

    facility["facility_type"] = centers 
    return facility 

私が行方不明ですか?

答えて

1

基本的にはディクテーションのように振る舞いますので、次の例ではディクテーションを使用します。

In [1]: dict_list = [] 
    ...: d = {} 
    ...: for i in range(3): 
    ...:  d['i'] = i 
    ...:  dict_list.append(d) 
    ...: print dict_list 
    ...: print [id(e) for e in dict_list] 
    ...: 
[{'i': 2}, {'i': 2}, {'i': 2}] 
[4557722520, 4557722520, 4557722520] 

Dictsが変更可能なオブジェクトであり、この場合には、あなたはリストに同じ dictのインスタンスを複数回追加されています。これを考慮してください。結果リストには異なる項目が含まれず、同じdictオブジェクトへの複数の参照のみが含まれます。次の例では、リストに同じ辞書を3回追加し、それに値を設定し、同じ動作を示しています

In [2]: dict_list = [] 
    ...: d = {} 
    ...: for i in range(3): 
    ...:  dict_list.append(d) 
    ...: d['some'] = 'value' 
    ...: print dict_list 
    ...: 
[{'some': 'value'}, {'some': 'value'}, {'some': 'value'}] 

あなたがする必要がどのようなの内側にそれらを初期化することによって異なる dictsを作成していますforループは、次のようになります。

In [3]: dict_list = [] 
    ...: for i in range(3): 
    ...:  d = {} 
    ...:  d['i'] = i 
    ...:  dict_list.append(d) 
    ...: print dict_list 
    ...: print [id(e) for e in dict_list] 
    ...: 
[{'i': 0}, {'i': 1}, {'i': 2}] 
[4557901904, 4557724760, 4557843264] 
1

ループ内ではなく、ループ内でアイテムを定義してみることができます。

def parse_centers_and_ambulances(self, response): 
    json_response = json.loads(response.body_as_unicode()) 
    facility = MedFacilityItem() 
    facility["name"] = "Med Facility #1" 
    centers = [] 
    # med_centers = MedCenterItem() <-- this 
    for center in json_response: 
     if center["name"].startswith("Center"): 
     med_centers = MedCenterItem() <-- should be here 
     med_centers["response_url"] = center["product_id"] 
     med_centers["name"] = center["name"] 
     med_centers["address"] = center["name_short"] + "." +  
               center["adr_name"] + " " + 
               center["adr_dom"] 
     med_centers["lat"] = center["latitude"] 
     med_centers["lon"] = center["longitude"] 
     med_centers["phoneInfo"] = [{"number": center["tel1"], 
            "description": center["tel1_descr"]}, 
            {"number": center["tel2"], 
            "description": center["tel2_descr"]}] 
     centers.append(med_centers) 

    facility["facility_type"] = centers 
    return facility 
関連する問題