4

基本的に、私は本当にデフォルトのセットアップ、サブクラス化されたスパイダー、CrawlSpiderおよび次のような3つのフィールドを持つアイテムを持っています:

class AppdexItem(Item):
    name = Field()
    url = Field()
    desc = Field()

私のスパイダーが応答を解析すると、次のようなアイテムが入力されます。

i = AppdexItem()
name = hxs.select("//h1[@class='doc-banner-title']/text()")
i['name'] = name.extract()[0]

フィールドが実際に何であるかを読んだとき、私は混乱しました。これは文字通りその実装です:

 class Field(dict):
     """Container of field metadata"""

あっさりシンプルdictです。なぜだろうと思い、しばらく実装を見つめていました。それでも意味がありませんでした。そこでscrapy shell、アイテムに解析されるはずのページを実行したところ、次のようになりました。

In [16]: item = spider.parse_app(response)

In [17]: item.fields
Out[17]: {'desc': {}, 'name': {}, 'url': {}}

In [18]: item['name']
Out[18]: u'Die Kleine Meerjungfrau'

何?私が何か完全に間違ったことをしている (公式のチュートリアルと例が教えてくれたようにすべてを行った) かFielddictまったく無意味です。

誰かが私にそれを説明できますか?

4

2 に答える 2

8

歴史的な理由。dictに保存されたフィールドにメタデータが添付されていました。便利な(key = value)コンストラクターがあるため、dictが使用されたと思います。これの最後の使用がこのコミットで削除されたことがわかります。この時点では、ほとんど違いはなく、単なるオブジェクトである可能性があります(ただし、何らかの理由でそれがdictであると想定するコードがまだ存在する場合、変更は困難になる可能性があります)。

于 2013-02-17T20:32:20.730 に答える
3

フィールド、メタデータを格納するための辞書として使用されます。1 つのユース ケースは、ItemLoader の入力プロセッサと出力プロセッサを指定することです。http://doc.scrapy.org/en/master/topics/loaders.html#declaring-input-and-output-processorsを確認してください。

個人的には、Scrapy がメタデータなしで単純な dict をサポートするのは良いことだと思いますが、それは別の問題です。

于 2014-08-01T20:00:04.800 に答える