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);
(二)判斷類別FilterHTMLParser使用入門(2)- Node內容,自己加入import部分)
public static void main(String[] args) { try{ Parser parser = new Parser( (HttpURLConnection) (new URL("http://127.0.0.1:8080/HTMLParserTester.html")).openConnection() ); // 这里是控制测试的部分,后面的例子修改的就是这个地方。 NodeFilter filter = new TagNameFilter ("DIV"); NodeList nodes = parser.extractAllNodesThatMatch(filter); if(nodes!=null) { for (int i = 0; i < nodes.size(); i++) { Node textnode = (Node) nodes.elementAt(i); message("getText:"+textnode.getText()); message("================================================="); } } } catch( Exception e ) { e.printStackTrace(); } }
輸出結果:
getText:div id="top_main" ================================================= getText:div id="logoindex" =================================================
NodeFilter filter = new HasChildFilter();
NodeFilter innerFilter = new TagNameFilter ("DIV"); NodeFilter filter = new HasChildFilter(innerFilter); NodeList nodes = parser.extractAllNodesThatMatch(filter);
2.2 HasChildFilter
下面讓我們來看看HasChildFilter。剛剛看到這個Filter的時候,我想當然地認為這個Filter回傳的是有Child的Tag。直接初始化了一個
getText:body ================================================= getText:div id="top_main" =================================================
public HasChildFilter (NodeFilter filter, boolean recursive)
NodeFilter filter = new HasChildFilter( innerFilter, true );
注意HasChildFilter還有一個建構子:
getText:html xmlns="http://www.w3.org/1999/xhtml" ================================================= getText:body ================================================= getText:div id="top_main" =================================================
如果recursive是false,則只對第一級子節點進行過濾只對第一級子節點進行過濾。看到輸出結果多了一個html xmlns="http://www.w3.org/1999/xhtml",這個是整個HTML頁面的節點(根節點),雖然這個節點下方直接沒有DIV節點,但它的子節點body下面有DIV節點,所以它也被匹配上了。的節點。
public HasAttributeFilter (); public HasAttributeFilter (String attribute); public HasAttributeFilter (String attribute, String value);
NodeFilter filter = new HasAttributeFilter(); NodeList nodes = parser.extractAllNodesThatMatch(filter);
什么也没有输出。
測試程式碼:
NodeFilter filter = new HasAttributeFilter( "id" ); NodeList nodes = parser.extractAllNodesThatMatch(filter);
getText:div id="top_main" ================================================= getText:div id="logoindex" =================================================
前面介紹的都是簡單的Filter,只能針對某種單一類型的條件進行過濾。 HTMLParser支援對於簡單類型的Filter進行組合,從而實現複雜的條件。原理和一般程式語言的邏輯運算是一樣的。
3.1 AndFilter
AndFilter可以把兩種Filter進行組合,只有同時滿足條件的Node才會被過濾。
測試程式碼:
NodeFilter filter = new HasAttributeFilter( "id", "logoindex" ); NodeList nodes = parser.extractAllNodesThatMatch(filter);
getText:div id="logoindex" =================================================
測試程式碼:
reeeNot
3的輸出結果: ter
測試程式碼:
public IsEqualFilter (Node node) { mNode = node; } accept函数也很简单: public boolean accept (Node node) { return (mNode == node); }
NodeFilter filter = new NodeClassFilter(RemarkNode.class); NodeList nodes = parser.extractAllNodesThatMatch(filter);
除了前面3.2中輸出的幾個Tag,其餘的Tag都在這裡了。
3.4 XorFilter
把前面的AndFilter換成NotFilter
測試程式碼:
getText:这是注释 ================================================= 可以看到只有RemarkNode(注释)被输出了。
<!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>白泽居-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 --> 白泽居-字符串1-www.baizeju.com <a href="http://www.baizeju.com">白泽居-链接文本-www.baizeju.com</a> </div> 白泽居-字符串2-www.baizeju.com </div> </body> </html>
TabNameFilter是最容易理解的一個Filter,根據Tag的名字進行過濾。
<!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>
以上就是HTMLParser使用详解(3)的内容,更多相关内容请关注PHP中文网(m.sbmmt.com)!