19.2. sgmllib —単純なSGMLパーサー—Pythonドキュメント

提供:Dev Guides
< PythonPython/docs/2.7/library/sgmllib
移動先:案内検索

19.2。 sgmllib —シンプルなSGMLパーサー

バージョン2.6以降非推奨: sgmllib モジュールはPython3で削除されました。


このモジュールは、SGML(Standard Generalized Mark-up Language)でフォーマットされたテキストファイルを解析するための基礎として機能するクラス SGMLParser を定義します。 実際、完全なSGMLパーサーは提供していません。HTMLで使用されている場合にのみSGMLを解析し、モジュールは htmllib モジュールのベースとしてのみ存在します。 HTMLParser モジュールでは、XHTMLをサポートし、多少異なるインターフェイスを提供する別のHTMLパーサーを利用できます。

class sgmllib.SGMLParser
SGMLParser クラスは、引数なしでインスタンス化されます。 パーサーは、次の構成を認識するようにハードコードされています。
  • それぞれ<tag attr="value" ...>および</tag>の形式の開始タグと終了タグ。
  • &#name;形式の数値文字参照。
  • &name;形式のエンティティ参照。
  • <!--text-->形式のSGMLコメント。 末尾の>と直前の--の間には、スペース、タブ、および改行が許可されていることに注意してください。

単一の例外も定義されています。

exception sgmllib.SGMLParseError

解析中にエラーが発生したときに SGMLParser クラスによって発生する例外。

バージョン2.1の新機能。

SGMLParser インスタンスには次のメソッドがあります。

SGMLParser.reset()
インスタンスをリセットします。 未処理のデータをすべて失います。 これは、インスタンス化時に暗黙的に呼び出されます。
SGMLParser.setnomoretags()
タグの処理を停止します。 以降のすべての入力をリテラル入力(CDATA)として扱います。 (これは、HTMLタグ<PLAINTEXT>を実装できるようにするためにのみ提供されています。)
SGMLParser.setliteral()
リテラルモード(CDATAモード)に入ります。
SGMLParser.feed(data)
パーサーにテキストをフィードします。 完全な要素で構成されている限り、処理されます。 不完全なデータは、さらにデータが供給されるか、 close()が呼び出されるまでバッファリングされます。
SGMLParser.close()
バッファリングされたすべてのデータを、ファイルの終わりマークが後に続くかのように強制的に処理します。 このメソッドは、入力の最後に追加の処理を定義するために派生クラスによって再定義される場合がありますが、再定義されたバージョンは常に close()を呼び出す必要があります。
SGMLParser.get_starttag_text()
最後に開いた開始タグのテキストを返します。 これは通常、構造化処理には必要ありませんが、「デプロイされたまま」のHTMLを処理したり、最小限の変更で入力を再生成したりする場合に役立ちます(属性間の空白を保持できるなど)。
SGMLParser.handle_starttag(tag, method, attributes)

このメソッドは、start_tag()またはdo_tag()メソッドが定義されている開始タグを処理するために呼び出されます。 tag 引数は小文字に変換されたタグの名前であり、 method 引数は、開始タグのセマンティック解釈をサポートするために使用する必要があるバインドされたメソッドです。 attributes 引数は、タグの<>ブラケット内にある属性を含む(name, value)ペアのリストです。

名前は小文字に翻訳されています。 value の二重引用符と円記号、および既知の文字参照とセミコロンで終了する既知のエンティティ参照(通常、エンティティ参照は英数字以外の文字で終了できますが、これは壊れます)が解釈されましたeggsが有効なエンティティ名である場合の、<A HREF="url?spam=1&eggs=2">の非常に一般的なケース)。

たとえば、タグ<A HREF="http://www.cwi.nl/%22>の場合、このメソッドはunknown_starttag('a', [('href', 'http://www.cwi.nl/')])として呼び出されます。 基本実装は、属性を唯一の引数としてメソッドを呼び出すだけです。

バージョン2.5の新機能:属性値内のエンティティおよび文字参照の処理。

SGMLParser.handle_endtag(tag, method)
このメソッドは、end_tag()メソッドが定義されているエンドタグを処理するために呼び出されます。 tag 引数は小文字に変換されたタグの名前であり、 method 引数は、終了タグのセマンティック解釈をサポートするために使用する必要があるバインドされたメソッドです。 終了要素にend_tag()メソッドが定義されていない場合、このハンドラーは呼び出されません。 基本実装は単にメソッドを呼び出します。
SGMLParser.handle_data(data)
このメソッドは、任意のデータを処理するために呼び出されます。 これは、派生クラスによってオーバーライドされることを目的としています。 基本クラスの実装は何もしません。
SGMLParser.handle_charref(ref)

このメソッドは、&#ref;形式の文字参照を処理するために呼び出されます。 基本実装では、 convert_charref()を使用して参照を文字列に変換します。 そのメソッドが文字列を返す場合は、 handle_data()に渡されます。それ以外の場合は、エラーを処理するためにunknown_charref(ref)が呼び出されます。

バージョン2.5で変更:変換をハードコーディングする代わりに convert_charref()を使用します。

SGMLParser.convert_charref(ref)

文字参照を文字列、またはNoneに変換します。 ref は、文字列として渡される参照です。 基本実装では、 ref は0〜255の範囲の10進数である必要があります。 convert_codepoint()メソッドを使用して見つかったコードポイントを変換します。 ref が無効であるか範囲外の場合、このメソッドはNoneを返します。 このメソッドは、デフォルトの handle_charref()実装および属性値パーサーによって呼び出されます。

バージョン2.5の新機能。

SGMLParser.convert_codepoint(codepoint)

コードポイントを str 値に変換します。 sgmllib の残りの部分はこの問題に気づいていませんが、エンコードは必要に応じてここで処理できます。

バージョン2.5の新機能。

SGMLParser.handle_entityref(ref)

このメソッドは、&ref;の形式の一般エンティティ参照を処理するために呼び出されます。ここで、 ref は一般エンティティ参照です。 refconvert_entityref()に渡すことで変換します。 翻訳が返されると、翻訳とともにメソッド handle_data()が呼び出されます。 それ以外の場合は、メソッドunknown_entityref(ref)を呼び出します。 デフォルトのentitydefsは、&amp;&apos;&gt;&lt;、および&quot;の変換を定義します。

バージョン2.5で変更:変換をハードコーディングする代わりに convert_entityref()を使用します。

SGMLParser.convert_entityref(ref)

名前付きエンティティ参照を str 値またはNoneに変換します。 結果の値は解析されません。 ref はエンティティの名前のみになります。 デフォルトの実装では、インスタンス(またはクラス)変数entitydefsref が検索されます。これは、エンティティ名から対応する変換へのマッピングである必要があります。 ref に使用できる変換がない場合、このメソッドはNoneを返します。 このメソッドは、デフォルトの handle_entityref()実装および属性値パーサーによって呼び出されます。

バージョン2.5の新機能。

SGMLParser.handle_comment(comment)
このメソッドは、コメントが検出されたときに呼び出されます。 comment 引数は、<!---->の区切り文字の間のテキストを含む文字列ですが、区切り文字自体は含まれていません。 たとえば、コメント<!--text-->を指定すると、このメソッドは引数'text'で呼び出されます。 デフォルトのメソッドは何もしません。
SGMLParser.handle_decl(data)
SGML宣言がパーサーによって読み取られるときに呼び出されるメソッド。 実際には、DOCTYPE宣言はHTMLで観察される唯一のものですが、パーサーは異なる(または壊れた)宣言を区別しません。 DOCTYPE宣言の内部サブセットはサポートされていません。 data パラメーターは、<!>マークアップ内の宣言の内容全体になります。 デフォルトの実装は何もしません。
SGMLParser.report_unbalanced(tag)
このメソッドは、開いている要素に対応しない終了タグが見つかったときに呼び出されます。
SGMLParser.unknown_starttag(tag, attributes)
このメソッドは、不明な開始タグを処理するために呼び出されます。 これは、派生クラスによってオーバーライドされることを目的としています。 基本クラスの実装は何もしません。
SGMLParser.unknown_endtag(tag)
このメソッドは、不明な終了タグを処理するために呼び出されます。 これは、派生クラスによってオーバーライドされることを目的としています。 基本クラスの実装は何もしません。
SGMLParser.unknown_charref(ref)
このメソッドは、解決できない数字参照を処理するために呼び出されます。 デフォルトで何が処理されるかを判断するには、 handle_charref()を参照してください。 これは、派生クラスによってオーバーライドされることを目的としています。 基本クラスの実装は何もしません。
SGMLParser.unknown_entityref(ref)
このメソッドは、不明なエンティティ参照を処理するために呼び出されます。 これは、派生クラスによってオーバーライドされることを目的としています。 基本クラスの実装は何もしません。

上記のメソッドをオーバーライドまたは拡張する以外に、派生クラスは、特定のタグの処理を定義するために、次の形式のメソッドを定義することもできます。 入力ストリームのタグ名は大文字と小文字が区別されません。 メソッド名に含まれるタグは小文字である必要があります。

SGMLParser.start_tag(attributes)
このメソッドは、開始タグタグを処理するために呼び出されます。 do_tag()よりも優先されます。 attributes 引数は、上記の handle_starttag()で説明したのと同じ意味を持ちます。
SGMLParser.do_tag(attributes)
このメソッドは、start_tag()メソッドが定義されていない開始タグタグを処理するために呼び出されます。 attributes 引数は、上記の handle_starttag()で説明したのと同じ意味を持ちます。
SGMLParser.end_tag()
このメソッドは、終了タグタグを処理するために呼び出されます。

パーサーは、終了タグがまだ検出されていないオープン要素のスタックを維持することに注意してください。 start_tag()によって処理されたタグのみがこのスタックにプッシュされます。 end_tag()メソッドの定義は、これらのタグではオプションです。 do_tag()またはunknown_tag()によって処理されるタグの場合、end_tag()メソッドを定義する必要はありません。 定義されている場合、使用されません。 タグにstart_tag()メソッドとdo_tag()メソッドの両方が存在する場合は、start_tag()メソッドが優先されます。