首頁  >  文章  >  web前端  >  HTMLParser使用詳解(2)

HTMLParser使用詳解(2)

黄舟
黄舟原創
2016-12-29 15:52:181105瀏覽

HTMLParser將解析過的資訊保存為一個樹的結構。 Node是資訊保存的資料類型基礎。
請看Node的定義:

public interface Node extends Cloneable;

Node中包含的方法有幾類:
對於樹型結構遍歷的函數,這些函數最容易理解:

Node getParent ():取得父节点
NodeList getChildren ():取得子节点的列表
Node getFirstChild ():取得第一个子节点
Node getLastChild ():取得最后一个子节点
Node getPreviousSibling ():取得前一个兄弟(不好意思,英文是兄弟姐妹,直译太麻烦而且不符合习惯,对不起女同胞了)
Node getNextSibling ():取得下一个兄弟节点

取得內容的函數:

reee Filter過濾的函數:


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页面中的结束位置

用於Visitor遍歷的函數:

void collectInto (NodeList list, NodeFilter filter):基于filter的条件对于这个节点进行过滤,符合条件的节点放到list中。

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

void accept (NodeVisitor visitor):对这个Node应用visitor
rr我們用HTMLParser最多的是處理HTML頁面,Filter或Visitor相關的函數是必須的,然後第一類和第二類函數是用得最多的。第一類函數比較容易理解,下面用例子說明第二類函數。

下面是用於測試的HTML檔案:


void setPage (Page page):设置这个Node对应的Page对象
void setText (String text):设置文本
void setChildren (NodeList children):设置子节点列表

測試程式碼:


void doSemanticAction ():执行这个Node对应的操作(只有少数Tag有对应的操作)
Object clone ():接口Clone的抽象函数。

輸出結果:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<head><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><title>白泽居-www.baizeju.com</title></head>
<html xmlns="http://www.w3.org/1999/xhtml">
<body >
<div id="top_main">
<div id="logoindex">
<!--这是注释-->
白泽居-www.baizeju.com
<a href="http://www.baizeju.com">白泽居-www.baizeju.com</a>
</div>
白泽居-www.baizeju.com
</div>
</body>
</html>

======================== ===========================

對於第一個Node的內容,對應的就是第一行,這個比較好理解。
從這個輸出結果中,也可以看出內容的樹狀結構。或者說是樹林結構。在Page內容的第一層Tag,如DOCTYPE,head和html,分別形成了一個最高層的Node節點(很多人可能對第二個和第四個Node的內容有點奇怪。實際上這兩個Node就是兩個換行符號。看到的內容都包含了。有趣的有兩點,一是

標籤中的Title內容是在plainText中的,可能在標題中可見的也算可見吧。另外就是像前面說的,HTML內容中的換行符什麼的,也都成了plainText,這個邏輯上好像有點問題。

另外可能大家發現toHtml,toHtml(true)和toHtml(false)的結果沒什麼差別。實際上也是這樣的,如果追蹤HTMLParser的程式碼就可以發現,Node的子類別是AbstractNode,其中實作了toHtml()的程式碼,直接呼叫toHtml(false),而AbstractNode的三個子類別RemarkNode,TagNode和TextNode中, toHtml(boolean verbatim)的實作中,都沒有處理verbatim參數,所以三個函數的結果是一模一樣的。如果你不需要實作你自己的什麼特殊處理,簡單使用toHtml就可以了。


 以上就是HTMLParser使用詳解(2)的內容,更多相關內容請關注PHP中文網(www.php.cn)!



陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn