大資料處理之道 (htmlparser擷取資料<一>)

來源:互聯網
上載者:User

標籤: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擷取資料<一>)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.