0

Pythonでいくつかのhtmlページを解析しようとしています。特定のタグに到達したら、すべてのデータの印刷を開始したいと思います。これまでのところ私はこれを思いついた:

class MyHTMLParser(HTMLParser):
    start = False;
    counter = 0;
    def handle_starttag(self,tag,attrs):
        if(tag == 'TBODY'):
            start = True;
            counter +=1
            #if counter == 1
    def handle_data(self,data):
        if (start == True): # this is the error line
            print data

問題は、開始が何であるかがわからないというエラーがあることです。グローバルを使用できることはわかっていますが、クラス全体の外部で変数を定義する必要はありませんか?

編集:startをself.startに変更すると問題は解決しますが、HTMLParser initを台無しにすることなくinit内で定義する方法はありますか?

4

3 に答える 3

2
class MyHTMLParser(HTMLParser):
    start = False;
    counter = 0;
    ...

これはあなたが思っていることをしません!

Java、C#、または同様の言語では、類似のコードが行うことは、allと呼ばれるオブジェクトのクラスが、初期値が。 、初期値が。MyHTMLParserの属性startを持つことを宣言することです。Falsecounter0

Pythonではクラスもオブジェクトです。他のすべてのオブジェクトと同様に、それらには独自の属性があります。したがって、Pythonで上記が行うことはMyHTMLParser、属性がにstart設定されFalse、属性がにcounter設定された、という名前のクラスオブジェクトを作成すること0です。1

もう1つ覚えておくべきことは、オブジェクトに属性を設定するような、裸の名前に割り当てる方法はまったくないということです。start = True常に。という名前の変数を設定しますstart2

MyHTMLParserしたがって、クラスには、インスタンスに属性を設定するコードは含まれていません。クラス本体のコードはクラスオブジェクト自体に属性を設定し、のコードhandle_starttagはローカル変数を設定します。ローカル変数はスコープから外れると破棄されます。

のコードは、同様の理由で、(設定したことのない)handle_dataという名前のローカル変数から読み取っています。startPythonでは、検索するオブジェクトを指定せずに属性を読み取る方法はありません。ベアstartは、ローカル関数スコープまたは外部スコープのいずれかで、常に変数を参照しています。オブジェクトの属性self.startを読み取る必要があります。startself

メソッドを定義するdefブロックは特別なものではなく、他の関数と同じです。その後、その関数がクラスオブジェクトの属性に格納されたときに、その関数をメソッドとして分類できるようになります。したがって、このselfパラメーターは他のパラメーターと同じように動作し、実際には他の名前と同じように動作します。名前を付ける必要はありませんself(ただし、これに従うのが賢明な規則です)。また、裸の名前の読み取りと書き込みで。の属性を検索する特別な特権はありませんself

それで:

  1. クラスブロックの初期値で属性を定義しないでください。これは、各インスタンスの属性ではなく、クラスのすべてのインスタンスによって共有される値用です。インスタンス属性は、特定のインスタンスへの参照がある場合にのみ初期化できます。最も一般的には__init__、これはメソッドで実行され、オブジェクトが存在するとすぐに呼び出されます。

  2. 属性を読み書きするオブジェクトを指定する必要があります。これは、あらゆる状況で常に当てはまります。特に、通常、メソッド内の属性を。と呼びます。self.attribute

それを適用する(そしてPythonでは必要のないセミコロンを削除する):

class MyHTMLParser(HTMLParser):
    def __init__(self):
        start = False
        counter = 0

    def handle_starttag(self, tag, attrs):
        if(tag == 'TBODY'):
            self.start = True
            self.counter += 1

    def handle_data(self, data):
        if (self.start == True):
            print data

1メソッドhandle_starttaghandle_dataは、クラスとして使用されるオブジェクトの属性である関数にすぎません。

2通常はローカル変数。であると宣言startした場合global、またはnonlocalそれは外部変数である可能性があります。ただし、他のオブジェクトが名前にバインドされている場合でも、近くにあるオブジェクトの属性ではありませself

于 2012-10-31T07:39:02.000 に答える
1

自己キーワードを使用する

class MyHTMLParser(HTMLParser):
    def __init__(self):
        self.start = False;
        self.counter = 0;
    def handle_starttag(self,tag,attrs):
        if(tag == 'TBODY'):
            self.start = True;
            self.counter +=1
            #if counter == 1
    def handle_data(self,data):
        if (self.start == True): # this is the error line
            print data
于 2012-10-31T07:07:31.927 に答える
0

;注意として、各行の最後にセミコロンを付ける必要はありません。必要に応じて、同じ行に複数のステートメントを配置するための区切り文字として使用できます。このPythonスニペットでセミコロンが許可されている理由を参照してください。

于 2012-10-31T07:20:08.710 に答える