11.9 Standard Module sgmllib
このモジュールではSGMLParserクラスが定義されています。
これはSGML(Standard Generalized Mark-up Language)フォーマットの
テキストファイルを解析するための基礎を提供します。
実際のところ、完全なSGMLパーサを提供するわけではありません
-- HTMLのためにしか使えません。
また htmllib モジュール
のためだけに存在するベースクラスです。
- SGMLParser ()
-
SGMLParserクラスは引数を持ちません。
パーサは以下のコンストラクションを認識します:
-
タグの開始と終了
"<tag attr="value" ...>" と
"</tag>", の各々。
-
数値キャラクタの参照 "&#name;"。
-
実体参照 "&name;".
-
SGML コメント "<!-text->"。
対応する">"までの間にスペース、タブ、改行が許されることと、
その直前の"-"に注意。
SGMLパーサのインスタンスは次のメソッドを持ちます。
- reset ()
-
インスタンスのリセット。
処理されていないデータは失われます。
これはインスタンスが生成される際に暗に呼ばれます。
- setnomoretags ()
-
タグの処理を中止します。
これ以降の入力をすべてリテラル(CDATA)として扱います。
(これはHTMLタグの<PLAINTEXT>を実装するためだけに存在します。)
- setliteral ()
-
リテラルモード(CDATAモード)に入ります。
- feed (data)
-
テキストをパーサに送り込みます。
テキストが完全な要素から構成されている場合のみ処理されます。
不完全な場合は、続くデータを読み込むかclose()が呼ばれるまで
バッファリングされます。
- close ()
-
マークの終端で終わっていればバッファのデータを強制的に処理します。
このメソッドは、入力データの終わりで追加の処理を定義する
派生クラスにより再定義されることがありますが、
再定義されたバージョンは常にclose()を呼び出す必要があります。
- handle_starttag (tag, method, attributes)
-
このメソッドは、
start_tag() か do_tag()にすでに定義されている
開始タグを取り扱うために呼び出されます。
tagは小文字のタグ名で、methodは開始タグの意味解析を
サポートするのに使用されるboundメソッドです。
attributesは(name, value)のペアのリストで、
タグの<>カッコの中の属性を含んでいます。
nameは小文字で、value中のダブルクォートとバックスラッシュが
評価されます。
例えば、<A HREF="http://www.cwi.nl/">に対しては
このメソッドは"unknown_starttag('a', [('href','http://www.cwi.nl/')])"
として呼び出されます。
基本の実装は単純に1つの引数attributesでmethodを呼び出すことです。
- handle_endtag (tag, method)
-
このメソッドは、end_tag()で定義された終了タグを
取り扱うために呼び出されます。
tagは小文字のタグ名、methodは終了タグの意味解析をサポートする
ために使用されるboundメソッドです。
終了要素としてend_tag()が定義されていないとき、
このハンドラは呼び出されません。
基本の実装は単純にmethodを呼び出すことです。
- handle_data (data)
-
このメソッドは、任意のデータを処理します。
これは派生クラスによってオーバーライドされるべきものです。
ベースクラスは何もしません。
- handle_charref (ref)
-
このメソッドは"&#ref;"形式のキャラクタ参照を処理します。
ベースの実装ではrefは0-255の10進数でなければなりません。
これは、キャラクタをASCII変換し、
キャラクタを引数にhandle_data()メソッドを呼び出します。
refが正しくなければunknown_charref(ref)がエラーを
取り扱うために呼び出されます。
サブクラスは、キャラクタ実体と呼ばれるものをサポートするためにこのメソッドを
オーバーライドします。
- handle_entityref (ref)
-
このメソッドは一般的な実体参照
("&ref;"の形式で、refは一般的な実体参照)
を処理するために呼び出されます。
これはrefをインスタンス(またはクラス)変数entitydefs
の中から探します。
entitydefsは実体名と対応する結果のマッピングである必要があります。
結果が見つかればhandle_data()が呼び出されます。
そうでなければ、unknown_entityref(ref)が呼び出されます。
デフォルトのentitydefsでは次が定義されています。
&, &apos, >,
<, および "
- handle_comment (comment)
-
このメソッドはコメントに出会ったとき呼び出されます。
commentはデリミタ"<!-"と"->"に囲まれた文字列です。
しかしデリミタは含まれません。
例えば、"<!-text->"であればこのメソッドは
'text'を引数に呼び出されます。
デフォルトでは何もしません。
- report_unbalanced (tag)
-
このメソッドは対応する開始タグがないのに、
終了タグが見つかった場合に呼び出されます。
- unknown_starttag (tag, attributes)
-
このメソッドは定義されていない開始タグを処理するために呼び出されます。
これは派生クラスによりオーバーライドされるべきものです。
このベースクラスは何もしません。
- unknown_endtag (tag)
-
このメソッドは定義されていない終了タグを処理するために呼び出されます。
これは派生クラスによりオーバーライドされるべきものです。
このベースクラスは何もしません。
- unknown_charref (ref)
-
このメソッドは定義されていない数値キャラクタ参照を
処理するために呼び出されます。
デフォルトでどういう振る舞いをするかはhandle_charref()を
参照してください。
これは派生クラスによりオーバーライドされるべきものです。
このベースクラスは何もしません。
- unknown_entityref (ref)
-
このメソッドは定義されていない実体参照を
処理するために呼び出されます。
これは派生クラスによりオーバーライドされるべきものです。
このベースクラスは何もしません。
上に述べたオーバーライドと拡張は別にして、派生クラスは特定のタグの
処理を定義する次の形式のメソッドを定義できます。
入力ストリーム中のタグ名は大文字小文字には関係なく、
メソッド名の中に小文字でtagを記述しなければなりません:
- start_tag (attributes)
-
このメソッドは開始タグtagを処理するために呼び出されます。
これはdo_tag()より優先されます。
attributesはhandle_starttag()で述べられているのと
同じ意味です。
- do_tag (attributes)
-
このメソッドは、対応する終了タグがない開始タグtagを
処理するために呼び出されます。
attributesはhandle_starttag()で述べられているのと
同じ意味です。
- end_tag ()
-
This method is called to process a closing tag tag.
パーサは、閉じていないタグに対する開いた要素の
スタックを保持していることに注意してください。
タグはstart_tag()によってのみスタックに積まれます。
end_tag()はこれらのタグに対するオプションメソッドです。
タグがdo_tag()またはunknown_tag()によって
処理されるためには、end_tag()が定義されていては駄目です。
定義されていると、使われません。
start_tag()とdo_tag()メソッドが両方存在する場合、
start_tag()が優先されます。
guido@python.org