[転帖]HtmlPaser予備研究



Html Parsserの予備研究
by lostfireこの二日間はウェブサイトのプログラミングの仕事をするつもりです.そこで、HtmlParseについて研究してみました.目的は速く手に入ることで、深く研究するのではなく、整理して、みんなと一緒に討論しました.
 
一、データ組織分析:
Html Parsserは主にNode、AbstractNode、およびTagによってHtmlを表現しています.RemarkとTextは比較的簡単ですからここで無視します.
  • Nodeはツリー構造を形成してHTMLを表す基礎であり、すべてのデータ表示はインターフェースである.Nodeはページツリー構造で表現されているページPageオブジェクトを定義し、親、子、兄弟ノードを取得する方法を定義し、対応するhttm文書にノードを定義する方法で、ノードの位置を定義している.フィルタリング方法を定義し、Visitorアクセス機構を定義しました.
  • AbstractNodeはNodeの一種の具体的なクラス実現であり、ツリー構造を構成する役割を果たしています.具体的なNodeに関連するaccetp
    方法、tostring、toHtml、toPlainTextString方法以外はAbstradeの具体的な操作がほとんどできません.
  • Tagは具体的な分析の主な内容である.Ta gはcompositeのTa
    gと他のTagを含んではいけない簡単なTagの2種類に分けられています.前者の基質はComppo
    siteTagで、そのサブクラスはBodyTag、Divを含んでいます.簡単なTagはBaseHrefTag
    とDocypeTagとFrame TagとImageTag
    とInputTagとJspTagとMetaTagとProcessing Instruction Tagの8種類があります.
  • Nodeは三つの種類に分けられます
  • RemarkNode:Htmlのコメント
  • を表します.
  • TagNode:ラベルノードは、最も多くの種類のノードタイプであり、上記Tagの具体的なノードクラスはTagNodeの実現である.
  • TextNode:テキストノード
  •  
    二、Visitor方式でHtmlにアクセスする:
     
    1、全体解析プロセス
  • は、一つのURLまたはページStringでPaser
  • を作成する.
  • このパーティでVisitorを作ってください.
  • は、ノード
  • を巡回するためにPaser.visit All NodeWithを使用する.
  • Visitorを取得してエルゴードしたデータ
  • 2,Visitプロセス
  • 解析をする前にしたこと:visitor.begingParsing
  • 毎回ノードNodeを取って、そのNodeにacceptを受け入れるようにします.このVis
    itor
  • 解析をした後にすること:visitor.finishedParssing();
  • 3,ノードを取得するプロセス:徐々にHtmlを巡回して、Nodeを分析します.この部分は複雑で、私達の応用に対して多くの理解が必要なく、暫くスキップします.
     
    4,ノードアクセス
    ノードアクセスはVisitorモードを採用し、Nodeのaccept方法とVisitメソッドがキーです.
    まず3種類のNodeがacceptに来る方式はそれぞれ違います.
  • はすべてのTagNodeに対して一つのaccept方法を使用しています.つまりTagNodeのaccept方法です.まずタグの最後かどうか判断します.そうでないとvisitor.visit Tag(this)
  • Text Nodeであれば、visitor.visit StringNode;いいです
  • RemarkNodeであればvisitorvisit RemarkNode(this)いいです
  • 実はNodeVisitorの中の四つのvisitの方法は全部空いています.この三つの種類のノードの処理は違っていますから.処理が必要なノードに対しては、対応するvisit方法を積載すればいいです.また、ユーザーが自分のVisi
    torを利用すれば、異なるタイプのノードを柔軟に処理することができます.
    システムは私達のために紹介したい8種類のVisito rを実現しました.実際にはシステムとして様々なVisityo
    rを見せてくれました.HtmlPaserを実際に使うには、特別なVisitorが必要です.簡単なこれらのシステムを通して提供されるV

    isitorの組み合わせは、何かを作るのが難しいです.
     
    三、システムVisitor機能概要:
  • Object FindingVisitor:指定されたすべての種類のノードを探し出し、getTags()を用いて結果を取得する.
  • StringBern:指定されたURLから取得するために使用されています.
  • HtmlPageを抽出します.Title、bodyのノードとページのTabTalegノードを抽出します.
  • Link FindingVisitor:ノードの中にあるリンクを含む総個数を探し出します.
  • String FindingVisitor:巡回しているTextNodeの中に指定された文字列の個数を見つけます.
  • TagFindingVisitor:指定されたTagのすべてのノードを探し出します.様々なタイプを指定できます.
  • Text ExtracctingVisitor:すべてのラベルをウェブページから削除してテキストを抽出します.このテキストを抽出するVisitorは実用的な場合があります.テキストを抽出する時はラベルの属性も削除します.つまりラベルだけを残します.例えばのリンクも削除しました。
  • UrlModifyingvisitor:ウェブページのリンクを修正するために使用されます.
  • ファイター
     
    visitorが情報を巡回して抽出するのであれば、もちろんこの情報はいくつかのノードまたはノードから分析されたより効果的な情報を含むことができ、これは私たちのVisitorがどのように作成されるかによって異なります.Filterはノードを抽出するための目標を明確にしています.HtmlParsserを使うには、まず上に述べたデータ組織を熟知しなければなりません.
     
    システムは17種類の具体的なFilterを定義しており、ノード父子関係に基づくFilter、Filterグループに接続するFilter、ウェブページの内容に応じて状況に合致するfilterなどを含んでいる.私たちはimplement Filterで自分のFilterを作ってノードを抽出することもできます.
     
    Filterの呼び出しはVisitorと独立しています.先filterからNodeListを出す必要もないので、Visitorで訪問します.Filterを呼び出す方法は、
    NodeList nodeList=myPaser.parse(someFilter)
    解析後、私達は採用できます.
    Node[]nodes=nodeList.toNodeAray();
    を選択します.
    Node node=nodeList.element At(i)はNodeを取得します.
     
    また、Filter後にNodeListを取得しても、NodeListのextract AllNodes That Matchを使ってさらにフィルタリングし、NodeListのisit AllNodes Withを使ってさらなるアクセスができます.
    このように、HtmlPaserが非常に便利なHtml解析方式を提供してくれているのを見ることができます.さまざまなアプリケーションに対して、Htmlノードを巡回してデータを抽出してもいいし、Filterでノードをフィルタして、私たちが注目するノードを抽出して、ノードを処理してもいいです.このような組み合わせを通じて、私たちが必要とする情報がきっと探し出せます.
     
    参考:
    http://htmlparser.sourceforge.net/
    http://www.blogjava.net/rocky/archive/2005/12/21/24997.aspx
    http://www.westing.cn/xblog/?p=90