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

このモジュールではパーザクラスと例外を一つづつ定義しています:

クラス `HTMLParser`( | formatter)

  基底となる HTML パーザクラスです。XHTML 1.0 仕様 (http://www.w3.rog/TR/xhtml1) 勧告で要求されている 全てのエンティティ名をサポートしています。

exception `HTMLParseError`
  `HTMLParser` クラスがパーズ処理中にエラーに遭遇した場合に 送出する例外です。 バージョン 2.4 で 新たに追加 された仕様です。

参考:

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

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

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

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