sgmllib Introduction

4585 ワード

8.2. sgmllib.py紹介
HTML処理は3つのステップに分けられます.HTMLをその構成セグメントに分解し、セグメントを加工し、次にセグメントをHTMLに再合成します.最初のステップはsgmllib.pyは標準Pythonライブラリの一部です.
この章を理解する鍵は、HTMLがテキストだけでなく、構造化されたテキストであることを知ることです.この構造は、開始フラグと終了フラグの多かれ少なかれ階層化シーケンスに由来する.通常、HTMLをこのように処理するのではなく、1つのテキスト編集でテキストで処理するか、ブラウザでブラウズまたはページ編集ツールで視覚的に編集します.sgmllib.pyはHTMLの構造を示しています.
sgmllib.pyにはSGMLParserという重要なクラスが含まれています.SGMLParserはHTMLを開始タグや終了タグなどの有用なセグメントに分解する.データが有用なセグメントとして正常に分解されると、発見されたデータに基づいて、独自の内部メソッドが呼び出されます.このアナライザを使用するには、SGMLParserクラスをサブクラス化し、これらのメソッドを上書きする必要があります.これは、HTML構造の意味を表していると言います.HTMLの構造は、メソッド呼び出しの順序と各メソッドに伝達されるパラメータを決定します.
SGMLParserはHTMLを8種類のデータに分析し、各クラスに対して個別の方法を呼び出す.
スタートタグ
最初のブロックです
HTMLタグは、、、または
など、または
などのユニークなタグです.開始タグが見つかったら
tagname,SGMLParserはstart_という名前で検索します
tagnameまたはdo_
tagnameの方法.たとえば、
タグが見つかった場合、start_が検索されます.preまたはdo_preの方法.見つかった場合、SGMLParserはこのタグの属性リストを使用してこの方法を呼び出す.そうでなければ、このタグの名前と属性リストでunknown_を呼び出します.starttagメソッド.
終了フラグ(End tag)
1つのブロックを終了します
HTMLタグは、、、または
などです.終了フラグが見つかった場合、SGMLParserはend_という名前で検索されます.
tagnameの方法.見つかった場合、SGMLParserはこのメソッドを呼び出します.そうしないと、タグの名前を使用してunknown_を呼び出します.endtag .
文字参照(Character reference)
文字の10進数または等しい16進数で表されるエスケープ文字.見つかった場合、SGMLParserは10進数または同等の16進数文字テキストを使用してhandle_を呼び出すcharref .
エンティティ参照(Entity reference)
HTMLエンティティ、例えば©.見つかった場合、SGMLParserは
HTMLエンティティの名前でhandleを呼び出すentityref .
コメント(Comment)
HTMLコメント、の間に表示されます.見つかった場合、SGMLParserはコメント内容でhandle_を呼び出すcomment.
処理命令(Processing instruction)
HTML処理命令、に含まれるの間に表示されます.見つかった場合、SGMLParserは処理命令の内容でhandle_を呼び出すpi.
宣言(Declaration)
DOCTYPEなどのHTML宣言はに含まれています.の間に表示されます.見つかった場合、SGMLParserは宣言内容でhandle_を呼び出すdecl.
テキストデータ(Text data)
テキストブロック.他の7種類のカテゴリを満たさないもの.見つかった場合、SGMLParserはテキストでhandle_を呼び出します.data.
Python 2.0にはSGMLParserが宣言を完全に認識できない(handle_declは決して呼び出さない)というバグがあり、これはDOCTYPEが静かに無視されていることを意味する.このエラーはPython 2.1で修正されました.
sgmllib.pyに付属するテストキットでは、この点を例に挙げて説明します.sgmllibを実行できます.pyは、コマンドラインの下にHTMLファイルの名前を入力し、タグや他の要素を分析しながら印刷します.SGMLParserクラスをサブクラス化し、unknown_を定義することを実現します.starttag,unknown_endtag,handle_dataと他の方法で実現されます.これらの方法は、それらのパラメータを簡単に印刷します.
WindowsのActivePython IDEでは、[Run script]ダイアログボックスでコマンドラインパラメータを指定できます.複数のパラメータをスペースで分割します.
例8.4. sgmllib.pyのサンプルテスト
次は、本書のHTMLバージョンからのディレクトリです.toc.html.もちろん、ストレージパスは私とは異なる場合があります.(本書のHTMLバージョンをダウンロードしていない場合は、http://diveintopython.org/ダウンロードします.
c:\python23\lib> type "c:\downloads\diveintopython\html\toc\index.html"

<!DOCTYPE html
  PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="en">
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
   
      <title>Dive Into Python</title>
      <link rel="stylesheet" href="diveintopython.css" type="text/css">

...   ...

sgmllib.pyのテストキットで実行すると、次のような出力が得られます.
c:\python23\lib> python sgmllib.py "c:\downloads\diveintopython\html\toc\index.html"
data: '

' start tag: <html lang="en" > data: '
' start tag: <head> data: '
' start tag: <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" > data: '

' start tag: <title> data: 'Dive Into Python' end tag: </title> data: '
' start tag: <link rel="stylesheet" href="diveintopython.css" type="text/css" > data: '
' ... ...

この章の他の部分の道しるべは次のとおりです.
  • サブクラス化SGMLParserは、HTMLドキュメントから関心のあるデータを抽出するクラスを作成する.
  • SGMLParserをサブクラス化してBaseHTML Processorを作成し、8つの処理方法をすべて上書きし、クリップから元のHTMLを再構築します.
  • サブクラス化BaseHTML ProcessorはDialectizerを作成するために使用され、指定したHTMLタグを処理してhandle_を上書きするためのいくつかの方法を追加しました.Dataメソッドは、HTMLタグ間のテキストブロックを処理するためのフレームワークを提供する.
  • サブクラス化Dialectizerは、テキスト処理ルールを定義したクラスを作成します.これらの規則はDialectizer.handle_data使用.
  • は、テストキットを作成し、http://diveintopython.org/本物のWebページをキャプチャし、処理します.

  • この章を引き続き読むと、locals、globals、dictionaryベースの文字列フォーマットについても学ぶことができます.