11.10 Standard Module htmllib
このモジュールでは、HyperText Mark-up Language (HTML)形式のテキストファイルを
解析するための土台として働くクラスを定義しています。
このクラスは入出力に対しては直接関係ありません
-- それはメソッドを通じて文字列形式の入力によって与えられ、
``formatter'オブジェクトのメソッドによって出力されます。
HTMLParserクラスは他のクラスの機能追加のためのベースクラスとして
使われるようにデザインされており、
拡張やオーバーライドのほとんどを許可します。
このクラスは、sgmllib モジュールで
定義されるSGMLParserクラスを拡張した派生クラスです。
HTMLParserの実装はRFC 1866に述べられている
HTML 2.0をサポートしています。
フォーマッタオブジェクトとformatter
モジュールの2つの実装については、フォーマッタインターフェースの方を
参照してください。
以下は、sgmllib.SGMLParserにより定義されたインターフェースの要約です。
-
データをインスタンスへと送り込むためのインターフェースが feed()
メソッドです。
引数は文字列です。
これは少しづつでも、必要なだけ一度にでも呼び出すことができます。
"p.feed(a); p.feed(b)"と"p.feed(a+b)"は同じ結果になります。
データが完全なHTMLタグを含んでいれば、即座に処理されますが、
不完全な場合はバッファに格納されます。
処理されていないデータを強制的に処理させるには、close()メソッドを
呼び出します。
例えば、ファイル全体を解析するには:
parser.feed(open('myfile.html').read())
parser.close()
-
HTMLタグの意味を定義するためのインターフェースは、とても単純です。
クラスを派生させてstart_tag(),end_tag()
またはdo_tag()メソッドを定義します。
パーサは適切にこれらを呼び出します。
start_tagまたはdo_tag()は
<tag ...>形式のタグが開いたとき、
end_tag()は<tag>形式でタグが閉じたときです。
開始タグに対して終了タグが要求される場合は、
(<H1> ... </H1>のような場合)
そのクラスではstart_tag()メソッドを定義する必要があります。
終了タグが必要ない場合は(<P>のように)、
do_tag()メソッドを定義します。
このモジュールでは一つのクラスが定義されています。
- HTMLParser (formatter)
-
これは基本的なHTMLパーサクラスです。
これはすべてのHTML 2.0の実体名をサポートします(RFC 1866)。
また、すべてのHTML2.0および多くのHTML3.0/3.2の要素のハンドラが定義されています。
タグのメソッドに加えて、
HTMLParserクラスは、いくつかの追加メソッド、
またタグのメソッドの中で使うためのインスタンス変数
を提供します。
- formatter
-
これはパーサと関連するフォーマッタインスタンスです。
- nofill
-
この真偽フラグは、スペースが縮められているかどうかを表し、
真のとき縮められておらず、そうでないときは偽です。
通常これが真になるのは、<PRE>要素で囲まれた
``preformatted''テキストの場合だけです。
デフォルトは偽です。
これはhandle_data()と save_end()操作の場合に有効です。
- anchor_bgn (href, name, type)
-
このメソッドは、アンカータグの開始時に呼び出されます。
引数は<A>タグの属性名と同じです。
デフォルトの実装ではドキュメント中の、(href属性で定義された)
ハイパーリンクのリストを保持します。
ハイパーリンクのリストは、anchorlist属性のデータとして使用可能です。
- anchor_end ()
-
このメソッドはアンカータグの終了時に呼び出されます。
デフォルトでは anchor_bgn()で作られたハイパーリンクに
インデックスを使用して脚注を追加します。
- handle_image (source, alt[, ismap[, align[, width[, height]]]])
-
このメソッドはイメージを取り扱うために呼び出されます。
デフォルトでは altの値をhandle_data()に渡すだけです。
- save_bgn ()
-
バッファのデータをフォーマッタオブジェクトに渡す代わりに、保存します。
保存されたデータはsave_end()で取り出します。
save_bgn() / save_end()のペアはネストすることはできません。
- save_end ()
-
データのバッファへの保存を終了し、前にsave_bgn()が呼び出されてからの
データをすべて返します。
nofillフラグが偽なら、複数の連続するスペースは一つにまとめられます。
save_bgn()なしにこのメソッドが呼び出されると、
TypeError例外が発生します。
guido@python.org