一、HTMLParser.net是什嗎?
HTMLParser.net是HtmlParser的JAVA版本的dot net版本。
二、HTMLParser可以用來做什嗎?
HtmlParser是用來改造或者提取HTML,通過HtmlParser可以高速,快捷的從Html頁面中分離出你想要的內容。
三、HTMLParser的核心模組是org.htmlparser.Parser類,這個類實際完成了對於HTML頁面的分析工作。這個類有下面幾個建構函式:
public Parser ();
public Parser (Lexer lexer, ParserFeedback fb);
public Parser (URLConnection connection,ParserFeedbackfb) throws ParserException;
public Parser (String resource, ParserFeedback feedback) throws ParserException;
public Parser (String resource) throws ParserException;
public Parser (Lexer lexer);
public Parser (URLConnection connection) throws ParserException;
和一個靜態類 public static Parser createParser (String html, String charset);
HTMLParser將解析過的資訊儲存為一個樹的結構。Node是資訊儲存的資料類型基礎。
請看Node的定義:
public interface Node extends Cloneable;
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的抽象函數
實際我們用HTMLParser最多的是處理HTML頁面,Filter或Visitor相關的函數是必須的,然後第一類和第二類函數是用得最多的
AbstractNodes是Node的直接子類,也是一個抽象類別。它的三個直接子類實現是RemarkNode,用於儲存注釋。在輸出結果的 toString部分中可以看到有一個"Rem (345[6,2],356[6,13]): 這是注釋",就是一個RemarkNode。TextNode也很簡單,就是使用者可見的文字資訊。TagNode是最複雜的,包含了HTML語言中的所有標籤,而且可以擴充(擴充 HTMLParser 對自訂標籤的處理能力)。TagNode包含兩類,一類是簡單的Tag,實際就是不能包含其他Tag的標籤,只能做葉子節點。另一類是 CompositeTag,就是可以包含其他Tag,是分支節點
HTMLParser遍曆了網頁的內容以後,以樹(森林)結構儲存了結果。HTMLParser訪問結果內容的方法有兩種。使用Filter和使用 Visitor。
(一)Filter類
顧名思義,Filter就是對於結果進行過濾,取得需要的內容。HTMLParser在 org.htmlparser.filters包之內一共定義了16個不同的Filter,也可以分為幾類。
判斷類Filter:
TagNameFilter
HasAttributeFilter
HasChildFilter
HasParentFilter
HasSiblingFilter
IsEqualFilter
邏輯運算Filter:
AndFilter
NotFilter
OrFilter
XorFilter
其他 Filter:
NodeClassFilter
StringFilter
LinkStringFilter
LinkRegexFilter
RegexFilter
CssSelectorNodeFilter
所有的Filter類都實現了org.htmlparser.NodeFilter介面。這個介面只有一個主要函數:
boolean accept (Node node);
各個子類分別實現這個函數,用於判斷輸入的Node是否符合這個Filter的過濾條件,如果符合,返回 true,否則返回false。
下面將以具體的例子來學習htmlparser.net