2

クロールしたいくつかのサイトを棚に入れようとしていますが、棚はサイト オブジェクトを受け入れません。リスト、文字列、タプルなどを受け入れますが、サイトオブジェクトを入れるとすぐに、シェルブの内容を取得しようとするとクラッシュします

だから私はこのように私の棚を埋めるとき:

def add_to_shelve(self, site):
    db = shelve.open("database")
    print site, site.url
    for word in site.content:
        db[word] = site.url #site.url is a string, word has to be one too

shelve.open("database")['whatever']完璧に動作します。

しかし、私がこれを行うと:

def add_to_shelve(self, site):
    db = shelve.open("database")
    print site, site.url
    for word in site.content:
        db[word] = site #site is now an object of Site

shelve.open("database")['whatever']次のエラー メッセージでエラーが発生します。

AttributeError: 'module' object has no attribute 'Site'

私は完全に困惑しており、奇妙なことに、pythondocs にも多くの情報がありません。彼らが言うのは、棚のキーは文字列でなければならないということだけですが、値またはデータは「任意のオブジェクト」にすることができます

4

2 に答える 2

5

オブジェクトをシェルブに保存した後、コードをリファクタリングしたようです。シェルブからオブジェクトを取得するとき、Python はオブジェクトを再構築し、移動したと思われる元のクラスを見つける必要があります。この問題は、pickle(shelveモジュールのように) を使用する場合によく見られます。

pduel が示唆するように、解決策は、以前と同じ場所にあるクラスへの下位互換性参照を提供して、それpickleを見つけることができるようにすることです。すべてのオブジェクトを再保存して pickle を再構築すると、後方互換性参照を削除できます。

于 2010-04-08T20:12:20.390 に答える
0

Pythonは「Site」オブジェクトのコンストラクターを探していますが、見つかりません。私は棚を使ったことがありませんが、漬けるものの規則はビザンチンであり、棚の規則は似ていると思います。

次の行を追加してみてください。

サイト=sitemodule.Site

(「サイト」を提供するモジュールの名前で)棚上げを試みる前に。これにより、Siteクラスを確実に見つけることができます。

于 2010-04-08T17:12:36.390 に答える