# 13.3 `htmllib` -- HTML 文書の解析器

このモジュールでは、ハイパーテキスト記述言語 (HTML, HyperText Mark-up Language) 形式で書式化されたテキストファイルを解析するための基盤として 役立つクラスを定義しています。このクラスは I/O と直接的には接続 されません -- このクラスにはメソッドを介して文字列形式の入力を 提供する必要があり、出力を生成するには ``フォーマッタ (formatter)'' オブジェクトのメソッドを何度か呼び出さなくてはなりません。

`HTMLParser` クラスは、機能を追加するために他のクラスの基底クラス として利用するように設計されており、ほとんどのメソッドが拡張したり 上書きしたりできるようになっています。 さらにこのクラスは `sgmllib` モジュール で定義されている `SGMLParser` クラスから導出されており、その機能 を拡張しています。`HTMLParser` の実装は、RFC 1866 で解説されている HTML 2.0 記述言語をサポートします。 `formatter` では 2 つのフォーマッタ オブジェクト実装が提供されています; フォーマッタのインタフェースに ついての情報は `formatter` モジュールのドキュメントを参照 してください。

以下は `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()` を定義しなければなりません。

このモジュールではクラスを一つだけ定義しています:

class `HTMLParser`( | formatter)

  基底となる HTML パーザクラスです。HTML 2.0 仕様 (RFC 1866) が要求 している全てのエンティティ名をサポートしています。このクラスでは また、 HTML 2.0 の全てのタグ要素と HTML 3.0 および 3.2 の多くの タグ要素に対するハンドラを定義しています。

参考資料:

`formatter`モジュール:
  抽象化された書式イベントの流れを writer オブジェクト上の特定の出力イベントに変換するための インターフェース。.

`HTMLParser`モジュール:
  HTML パーザのひとつです。やや低いレベル でしか入力を扱えませんが、XHTML を扱うことができるように設計 されています。``広く知られている HTML (HTML as deployed)'' では 使われておらずかつ XHTML では正しくないとされる SGML 構文のいくつか は実装されていません。.

`htmlentitydefs`モジュール:
  HTML 2.0 エンティティに対する置換 テキストの定義。.

`sgmllib`モジュール:
  `HTMLParser` の基底クラス。.