標籤:htmlparser精簡api htmlparser簡介
一:簡介
(1)HTML Parser是一個用於解析Html的Java的庫,可採用線性或嵌套兩種方式。主要用於網頁的轉換或提取,他有一些特性:過濾器filter,遍曆器visitors,通常的標籤tagName和易用的JavaBeans。它是一個快速,健壯,並嚴格測試過的組件。
(2)個人理解:HTMLParser遍曆了網頁的內容以後,以樹(森林)結構儲存了結果,各個節點代表HTML中的標籤和屬性值,非常類似於XML解析器解析後的結果,也類似與html dom的結構;HTMLParser訪問結果內容的方法有兩種:使用Filter和使用Visitor,一般Filter用的多一些,用於提取特定的網頁資訊。
(3)官方API說明 (需要Google的)
二:主要函數功能說明:
(1)HTMLParser的核心模組是org.htmlparser.Parser類,這個類實際完成了對於HTML頁面的分析工作。這個類有下面幾個建構函式:
public Parser ();
public Parser (Lexer lexer, ParserFeedback fb);
public Parser (URLConnection connection, ParserFeedback fb) 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);
(2)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頁面中的結束位置
(3)其它函數:
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):設定子節點列表
(4)用於Filter過濾的函數
顧名思義,Filter就是對於結果進行過濾,取得需要的內容。HTMLParser在org.htmlparser.filters包之內一共定義了16個不同的Filter,也可以分為幾類。
判斷類Filter:
TagNameFilter ----- html標籤指定指定過濾器
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。
三:html結構解析圖示說明
(1)html代碼
<html> <head> <title>HTML DOM</title> </head> <body> <h1>DOM的結構</h1> <p><a href="href">連結</a></p> </body></html>
(2)html的dom結構(即parser後的解析樹形結構)
(3)說明
- 由結構圖中我們可以看到,整個文檔就是一個文檔節點。
- 而每一個HMTL標籤都是一個元素節點。
- 標籤中的文字則是文位元組點。
- 標籤的屬性是屬性節點。
- 一切都是節點……
總之,節點樹的概念一目瞭然,最上面的就是“樹根”了。節點之間有父子關係,祖先與子孫關係,兄妹關係。這些關係也很好看出來,直接連線的就是父子關係了。而有一個父親的就是兄妹關係……更多dom詳見W3C
大資料處理之道 (htmlparser擷取資料<一>)