3

Win7x64でPython3.2を使用する。IDLEを起動するたびに実行したいスクリプトがあります。これは私のスクリプトです:

import sys
from bs4 import BeautifulSoup

sys.setrecursionlimit(2000)

soup = BeautifulSoup()
def soupSetup(file_name, encode_type):
    soup = BeautifulSoup(open("C:\\Python32\\html\\"+file_name+".html", encoding=encode_type))

このようにしてすべてが設定され、soupSetup()使用するhtmlファイルを渡すだけで、データの操作を開始できます。

私の問題はこれです-私が使用するときにコードをそのまま使用するprint(soup.prettify())と、何も返されませんが、空白行が返されます。printステートメントを実行するときに最初にクラスをインスタンス化しないと、次のようになります。

Traceback (most recent call last):
  File "<pyshell#22>", line 1, in <module>
    print(soup.prettify())
NameError: name 'soup' is not defined

BeautifulSoupに慣れていない人のために、スープはのインスタンスです<class 'bs4.BeautifulSoup'>

スクリプトの外部でスープオブジェクトを永続化するにはどうすればよいですか?

4

2 に答える 2

0

soupステートメントを使用して、モジュールに対してグローバルな名前を作成しますsoup = BeautifulSoup()。次に、関数で、名前を別のオブジェクトsoupSetupに再割り当てします。今回はデータを使用します。soupBeautifulSoup()

ただし、関数内の名前はその関数に対してローカルであり、その関数の外では保持されません。したがって、グローバル名を再割り当てするのではなく、関数内にsoup新しい個別の変数を作成することになります。この変数は、関数が存在するときに削除されます。soupグローバルsoupは変更されていません。soupこれが、変数を使用するときに最初に作成した空のBeatifulSoup()オブジェクトを取得する理由です。

次のように、グローバル名を再割り当てすることを関数に指示する必要があります。

def soupSetup(file_name, encode_type):
    global soup
    soup = BeautifulSoup(open("C:\\Python32\\html\\"+file_name+".html", encoding=encode_type))

それはそれをする必要があります。また、設定する必要はありsoup = BeautifulSoup()ません。関数によって上書きされるため、何に設定してもかまいません。代わりにこれを行ってください:

soup = None

完全なコードは次のようになります。

import sys
from bs4 import BeautifulSoup

sys.setrecursionlimit(2000)

soup = None
def soupSetup(file_name, encode_type):
    global soup
    soup = BeautifulSoup(open("C:\\Python32\\html\\"+file_name+".html", encoding=encode_type))
于 2012-12-07T05:18:18.153 に答える
-1

1つに2つの質問があります。

起動時に実行されるコードに関する最初の質問は、 http: //docs.python.org/dev/library/site.htmlに従って、あるディレクトリにusercustomize/sitecustomizeモジュールを作成することで解決されます。

これで、2番目の質問は次のように拡張することで解決できます__builtin__

import __builtin__
setattr(__builtin__, 'soup', soup)

スタートアップモジュール(適切な場所)で、そしてスープは他のどこでも魔法のように利用できるようになります。これを行うことはお勧めしません。達成したいことを再考する必要があるかもしれません。また、現在のアプローチでは、soup内部を再定義しますsoupSetup。したがって、その関数内で、ローカル変数を作成するのではなく、グローバル変数を再定義することを指定する必要があります。

def soupSetup(...):
    global soup
    ...
于 2012-12-07T12:35:19.840 に答える