2016-11-13 5 views
1

別の名前でシリアル化するための方法フィールドはありますか?たとえば、 'product_name'フィールドは 'product name'になります。アイテムのフィールドを別の名前でシリアル化

おかげ

"何らかの値":私はそれはいくつかの他の名前 "になりたい一方で、 "何らかの値":その後、

l.add_xpath('product_name','//[@id="some_id"]/text()') 

は 'PRODUCT_NAME' としてシリアライズされます

class PropertyItem(Item): 
     product_name = Field() 

答えて

2

あなたのことを完全に理解しているかどうかはわかりませんが、いつでもitem pipelinesを使用して、スパイダーが返すアイテムを編集したり変更したりできます。

はたとえば、あなたはこのような何かを行うことができます:デフォルトのscrapy.Itemフィールドによって

class FooPipeline(object): 
    def process_item(self, item, spider): 
     new_value = item['product_name'] + ' new name' 
     del item['product_name'] 
     item['some other name'] = new_value 
     return item 

は、静的なだけ定義されたフィールドを設定することができます。あなたは__setitem__()魔法のメソッドをオーバーライドすることで、これを避けることができます。

class TestItem(scrapy.Item): 
    name = scrapy.Field() 

    def __setitem__(self, key, value): 
     self._values[key] = value 

、結果:

t = TestItem() 
t['name2'] = 'one' 
print(t) 
>>> {'name2': 'one'} 
# even though name2 is not defined 
+0

2016年11月14日午前21時30分14秒[scrapy] ERROR:エラー処理{ 'URL': 'http://www.example.com/kit400.html'、 'product_name': 'aa 400'、 ...} Tra: ファイル "/Library/Python/2.7/site-packages/twisted/current.result = callback(current.result、* args、** kw) ファイル "/pipelines.py"、行30、process_item内 アイテム[new_key] = [インターネット/ defer.py]、行588、_runCallbacks値 ファイル "/Library/Python/2.7/site-packages/scrapy/item.py"、63行目、__setitem__ (self .__クラス__.__ name__、key)) KeyError: 'CatalogsItemはフィールドをサポートしていません:製品名' – AlonS

+0

@ AlonSあなたの商品は仕様にそのフィールドを持っていないとだけ言います。任意のフィールドと同様に、 'new_key = scrapy.Field()'のように 'CatalogsItem'に' new_key'を追加するだけです。 – Granitosaurus

+0

それは正しいですが、私は名前にスペースを含むフィールドに名前を変更したいと考えています。それを行う方法はありません。 'new key = Field()'は行かないでしょう – AlonS

0

あなたが__init__方法やあなたのItemクラスの追加フィールドを定義する場合、あなたは自分の名前を選択する際にあまり制限されています:

class TestItem(scrapy.Item): 
    name = scrapy.Field() 

    def __init__(self): 
     super().__init__() 
     self.fields["product name"] = scrapy.Field() 
パイプラインは、変更項目のフィールドをさせません
関連する問題