1. 程式人生 > >【垂直搜尋引擎搭建12】htmlparser簡介

【垂直搜尋引擎搭建12】htmlparser簡介

1、相關資料

2、使用HtmlPaser的關鍵步驟

(1)通過Parser類建立一個直譯器

(2)建立Filter或者Visitor

(3)使用parser根據filter或者visitor來取得所有符合條件的節點

(4)對節點內容進行處理

3、使用Parser的建構函式建立直譯器

  • Parser()
  • Parser(Lexer lexer)
  • Parser(Lexer lexer, ParserFeedback fb)
  • Parser(String resource)
  • Parser(String resource, ParserFeedback feedback)
  • Parser(URLConnection connection)
  • Parser(URLConnection connection, ParserFeedback fb)

4、htmlparser對html頁面處理的資料結構

這裡寫圖片描述

HtmlParser主要靠Node、AbstractNodeTag來表達Html,因為Remark和Text相對簡單,此處就將其忽略了。

  • Node是形成樹結構表示HTML的基礎,所有的資料表示都是介面Node的實現,Node定義了與頁面樹結構所表達的頁面Page物件,定義了獲取父、子、兄弟節點的方法,定義了節點到對應html文字的方法,定義了該節點對應的起止位置,定義了過濾方法,定義了Visitor訪問機制。
  • AbstractNode是Node的一種具體的類實現,起到構成樹形結構的作用,除了同具體Node相關的accetp方法,toString,toHtml,toPlainTextString方法以外,AbstractNode實現了大多基本的方法,使得它的子類,不用理會具體的樹操作。
  • Tag是具體分析的主要內容。Tag分成composite的Tag和不能包含其他Tag的簡單Tag兩類,其中前者的基類是CompositeTag,其子類包含BodyTag,Div,FrameSetTag,OptionTag等27個子類;而簡單Tag有BaseHrefTag、DoctypeTag,FrameTag,ImageTag,InputTag,JspTag,MetaTag,ProcessingInstructionTag這八類。

Node分成三類:

  • RemarkNode:代表Html中的註釋
  • TagNode:標籤節點,是種類最多的節點型別,上述Tag的具體節點類都是TagNode的實現。
  • TextNode:文字節點

5、Node中包含的方法

對於樹型結構進行遍歷的函式,這些函式最容易理解:

Node getParent ():取得父節點
NodeList getChildren ():取得子節點的列表
Node getFirstChild ():取得第一個子節點
Node getLastChild ():取得最後一個子節點
Node getPreviousSibling ():取得前一個兄弟
Node getNextSibling ():取得下一個兄弟節點

取得Node內容的函式:

String getText ():取得文字
String toPlainTextString():取得純文字資訊。
String toHtml () :取得HTML資訊(原始HTML)
String toHtml (boolean verbatim):取得HTML資訊(原始HTML)
String toString ():取得字串資訊(原始HTML)
Page getPage ():取得這個Node對應的Page物件
int getStartPosition ():取得這個Node在HTML頁面中的起始位置
int getEndPosition ():取得這個Node在HTML頁面中的結束位置

用於Filter過濾的函式:

void collectInto (NodeList list, NodeFilter filter):基於filter的條件對於這個節點進行過濾,符合條件的節點放到list中。

用於Visitor遍歷的函式:

void accept (NodeVisitor visitor):對這個Node應用visitor

用於修改內容的函式,這類用得比較少:

void setPage (Page page):設定這個Node對應的Page物件
void setText (String text):設定文字
void setChildren (NodeList children):設定子節點列表

其他函式:

void doSemanticAction ():執行這個Node對應的操作(只有少數Tag有對應的操作)
Object clone ():介面Clone的抽象函式。