# 19.3. `htmllib` --- HTML 文書の解析器

バージョン 2.6 で非推奨: `htmllib` モジュールは Python 3 で削除されました。Python 2 では代わりに `HTMLParser` を使ってください。なお、 `HTMLParser` は Python 3 では `html.parser` に移動しています。

このモジュールでは、ハイパーテキストマークアップ言語 (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 `htmllib.``HTMLParser`(formatter)

  基底となる HTML パーザクラスです。XHTML 1.0 仕様 (https://www.w3.org/TR/xhtml1) 勧告で要求されている全てのエンティティ名をサポートしています。また、全ての HTML 2.0 の要素および HTML 3.0、3.2 の多くの要素のハンドラを定義しています。

exception `htmllib.``HTMLParseError`

  `HTMLParser` クラスがパーズ処理中にエラーに遭遇した場合に送出する例外です。

  バージョン 2.4 で追加.

参考

`formatter` モジュール
  抽象化された書式イベントの流れを writer オブジェクト上の特定の出力イベントに変換するためのインターフェース。
`HTMLParser` モジュール
  HTML パーザのひとつです。やや低いレベルでしか入力を扱えませんが、XHTML を扱うことができるように設計されています。"広く知られている HTML (HTML as deployed)" では使われておらずかつ XHTML では正しくないとされる SGML 構文のいくつかは実装されていません。
`htmlentitydefs` モジュール
  XHTML 1.0 エンティティに対する置換テキストの定義。
`sgmllib` モジュール
  `HTMLParser` の基底クラス。

## 19.3.1. HTMLParser オブジェクト

タグメソッドに加えて、 `HTMLParser` クラスではタグメソッドで利用するためのいくつかのメソッドとインスタンス変数を提供しています。

`HTMLParser.``formatter`

  パーザに関連付けられているフォーマッタインスタンスです。

`HTMLParser.``nofill`

  ブール値のフラグで、空白文字を縮約したくないときには真、縮約するときには偽にします。一般的には、この値を真にするのは、 `<PRE>` 要素の中のテキストのように、文字列データが "書式化済みの (preformatted)" 場合だけです。標準の値は偽です。この値は `handle_data()` および `save_end()` の操作に影響します。

`HTMLParser.``anchor_bgn`(href, name, type)

  このメソッドはアンカー領域の先頭で呼び出されます。引数は `<A>` タグの属性で同じ名前を持つものに対応します。標準の実装では、ドキュメント内のハイパーリンク (`<A>` タグの `HREF` 属性) を列挙したリストを維持しています。ハイパーリンクのリストはデータ属性 `anchorlist` で手に入れることができます。

`HTMLParser.``anchor_end`()

  このメソッドはアンカー領域の末尾で呼び出されます。標準の実装では、テキストの脚注マーカを追加します。マーカは `anchor_bgn()` で作られたハイパーリンクリストのインデクス値です。

`HTMLParser.``handle_image`(source, alt[, ismap[, align[, width[, height]]]])

  このメソッドは画像を扱うために呼び出されます。標準の実装では、単に `handle_data()` に alt の値を渡すだけです。

`HTMLParser.``save_bgn`()

  文字列データをフォーマッタオブジェクトに送らずにバッファに保存する操作を開始します。保存されたデータは `save_end()` で取得してください。 `save_bgn()` / `save_end()` のペアを入れ子構造にすることはできません。

`HTMLParser.``save_end`()

  文字列データのバッファリングを終了し、以前 `save_bgn()` を呼び出した時点から保存されている全てのデータを返します。 `nofill` フラグが偽の場合、空白文字は全てスペース文字一文字に置き換えられます。予め `save_bgn()` を呼ばないでこのメソッドを呼び出すと `TypeError` 例外が送出されます。

# 19.4. `htmlentitydefs` --- HTML 一般エンティティの定義

注釈

Python 3 で `htmlentitydefs` モジュールは `html.entities` と改名されました。ソースを 3 用に変換する際には 2to3 ツールが自動的に import を直してくれます。

ソースコード: Lib/htmlentitydefs.py

このモジュールでは `name2codepoint` 、 `codepoint2name` 、 `entitydefs` の三つの辞書を定義しています。 `entitydefs` は `htmllib` モジュールで `HTMLParser` クラスの `entitydefs` メンバを定義するために使われます。このモジュールでは XHTML 1.0 で定義された全てのエンティティを提供しており、 Latin-1 文字集合 (ISO-8859-1) の簡単なテキスト置換を行う事ができます。

`htmlentitydefs.``entitydefs`

  各 XHTML 1.0 実体定義と ISO Latin-1 における置換テキストとを対応付ける辞書です。

`htmlentitydefs.``name2codepoint`

  HTML 実体名と Unicode コードポイントとを対応付ける辞書です。

  バージョン 2.3 で追加.

`htmlentitydefs.``codepoint2name`

  Unicode コードポイントと HTML 実体名とを対応付ける辞書です。

  バージョン 2.3 で追加.