HtmlParser應用,使用Filter從爬取到的網頁中獲取需要的內容


htmlparser是一個純的java寫的html解析的庫,它不依賴於其它的java庫文件,主要用於改造或提取html。它能超高速解析html,而且不會出錯。現在htmlparser最新版本為2.0

下載地址http://sourceforge.net/projects/htmlparser/ 

在線APIhttp://www.ostools.net/apidocs/apidoc?api=HTMLParser

Filter就是對於結果進行過濾,取得需要的內容。HTMLParserorg.htmlparser.filters包之內一共定義了15個不同的Filter

AndFilter、CssSelectorNodeFilter、HasAttributeFilter、HasChildFilter、HasSiblingFilter、IsEqualFilter、LinkRegexFilter、LinkStringFilter、NodeClassFilter、NotFilter、OrFilter、RegexFilter、StringFilter 、TagNameFilter.

常用的幾個過濾器說明 

TagNameFilter:   
是最容易理解的一個Filter,根據Tag的名字進行過濾

HasChildFilter: 
是返回有符合條件的子節點的節點,需要另外一個Filter作為過濾子節點的參數。

HasAttributeFilter:
可以匹配出包含制定名字的屬性,或者制定屬性為指定值的節點。HasParentFilter和HasSiblingFilter的功能與HasChildFilter類似。

StringFilter:    
這個Filter用於過濾顯示字符串中包含指定內容的標簽節點。注意是可顯示的字符串,不可顯示的字符串中的內容(例如注釋,鏈接等等)不會被顯示

RegexFilter :   
根據正則表達式匹配節點.與LinkRegexFilter不同的是,LinkRegexFilter只在LinkTag中尋找匹配

NodeClassFilter: 
根據已定義的標簽類獲取節點

LinkStringFilter:
這個Filter用於判斷鏈接中是否包含某個特定的字符串,可以用來過濾出指向某個特定網站的鏈接。

OrFilter:  
是結合幾種過濾條件的'或'過濾器 

AndFilter:     
是結合幾種過濾條件的'與'過濾器

實例應用

NodeClassFilter過濾器實例

    /** * * 過濾頁面中的標簽信息 * * @param url 要解析的url頁面 * @param encoding 使用的字符編碼 * @param tagclass * 要或取得頁面標簽,如要獲取頁面中的超鏈接 值為LinkTag.class,要獲取頁面中圖片鏈接,值為ImageTag.class * 要傳入的標簽類為org.htmlparser.tags下的 */
    public static void nodeFilterTagClass(String url,String encoding,Class tagclass){ try { Parser parser = new Parser(); parser.setURL(url); if(null==encoding){ parser.setEncoding(parser.getEncoding()); }else{ parser.setEncoding(encoding); } //過濾頁面中的鏈接標簽
            NodeFilter filter = new NodeClassFilter(tagclass); NodeList list = parser.extractAllNodesThatMatch(filter); for(int i=0; i<list.size();i++){ Node node = (Node)list.elementAt(i); System.out.println("link is :" + node.toHtml()); } } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { String url = "http://wenku.baidu.com/search?word=htmlparser&lm=0&od=0&fr=top_home"; //獲取頁面中的<a href='xxx' [屬性]>格式的鏈接
        nodeFilterTagClass(url, "UTF-8", LinkTag.class); //或取頁面中的<img src='xxx' [屬性='屬性值']>格式的鏈接
        nodeFilterTagClass(url, "UTF-8", ImageTag.class); //或取頁面<title>xxxx</title>標題
        nodeFilterTagClass(url, "UTF-8", TitleTag.class); //獲取頁面<div [屬性='屬性值']> xxx</div> //nodeFilterTagClass(url, "UTF-8", Div.class);
 }

程序運行結果:



TagNameFilter實例應用
是最容易理解的一個Filter,根據Tag的名字進行過濾

    /** * * 根據標簽名過濾頁面中的標簽信息 * * @param url 要解析的url頁面 * @param encoding 使用的字符編碼 * @param tagName 標簽名 */
    public static void nodeFilterTagName(String url,String encoding,String tagName){ try { Parser parser = new Parser(); parser.setURL(url); if(null==encoding){ parser.setEncoding(parser.getEncoding()); }else{ parser.setEncoding(encoding); } //過濾頁面中的鏈接標簽
            NodeFilter filter = new TagNameFilter(tagName); NodeList list = parser.extractAllNodesThatMatch(filter); for(int i=0; i<list.size();i++){ Node node = (Node)list.elementAt(i); System.out.println("link is :" + node.toHtml()); } } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { String url = "http://wenku.baidu.com/search?word=htmlparser&lm=0&od=0&fr=top_home"; //獲取頁面中的<a href='xxx' [屬性]>格式的鏈接
        nodeFilterTagName(url, "UTF-8", "a"); //或取頁面中的<img src='xxx' [屬性='屬性值']>格式的鏈接
        nodeFilterTagName(url, "UTF-8", "img"); //獲取頁面中的<div>鏈接 //nodeFilterTagName(url, "UTF-8", "div");
 }

程序運行結果同上

StringFilter實例應用
過濾顯示字符串中包含指定內容的標簽節點。注意是可顯示的字符串,不可顯示的字符串中的內容(例如注釋,鏈接等等)不會被顯示

    /** * 過濾顯示字符串中包含指定內容的標簽節點。注意是可顯示的字符串,不可顯示的字符串中的內容(例如注釋,鏈接等等)不會被顯示 * * @param url 請求處理的url * @param encoding 字符編碼 * @param containStr包含的指定內容 */
    public static void stringFilter(String url,String encoding,String containStr){ try { Parser parser = new Parser(); parser.setURL(url); if(null==encoding){ parser.setEncoding(parser.getEncoding()); }else{ parser.setEncoding(encoding); } //OrFilter是結合幾種過濾條件的‘或’過濾器
            NodeFilter filter = new StringFilter(containStr); NodeList list = parser.extractAllNodesThatMatch(filter); for(int i=0; i<list.size();i++){ Node node = (Node)list.elementAt(i); System.out.println("link is :" + node.toHtml()); } } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { String url = "http://wenku.baidu.com/search?word=htmlparser&lm=0&od=0&fr=top_home"; stringFilter(url, "UTF-8", "img.baidu.com"); }

程序運行結果




OrFilter實例應用
OrFilter是結合幾種過濾條件的‘或’過濾器,與此相反的是AndFilter,AndFilter是集合幾個過濾條件的‘與’過濾器

    /** * OrFilter是結合幾種過濾條件的‘或’過濾器 * * 一般主題信息包含在下列標簽中:<table>、<tr>、<td>、<p>、<div>等。如果要過濾出這些節點標簽,可以使用OrFilter過濾器 * * @param url 請求處理的url * @param encoding 使用的字符編碼 * @param filters 多個過濾器數組 */
    public static void orMultiFilter(String url,String encoding,NodeFilter[] filters){ try { Parser parser = new Parser(); parser.setURL(url); if(null==encoding){ parser.setEncoding(parser.getEncoding()); }else{ parser.setEncoding(encoding); } //OrFilter是結合幾種過濾條件的‘或’過濾器
            NodeFilter filter = new OrFilter(filters); NodeList list = parser.extractAllNodesThatMatch(filter); for(int i=0; i<list.size();i++){ Node node = (Node)list.elementAt(i); System.out.println("link is :" + node.toHtml()); } } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { String url = "http://wenku.baidu.com/search?word=htmlparser&lm=0&od=0&fr=top_home"; //過濾多個標簽 或關系
        NodeFilter[]  filters = new NodeFilter[3]; filters[0] = new NodeClassFilter(TableTag.class); filters[1] = new NodeClassFilter(ParagraphTag.class); filters[2] = new NodeClassFilter(ImageTag.class); orMultiFilter(url, "UTF-8", filters); }

程序運行結果:




RegexFilter與LinkRegexFilter實例應用
RegexFilter根據正則表達式匹配節點.與LinkRegexFilter不同的是,LinkRegexFilter只在LinkTag中尋找匹配

    /** * 在文本中通過正則進行匹配 * * @param url 請求處理的url * @param encoding 字符編碼 * @param regex 待匹配的正則表達式 */
    public static void regexStringFilter(String url,String encoding,String regex){ try { Parser parser = new Parser(); parser.setURL(url); if(null==encoding){ parser.setEncoding(parser.getEncoding()); }else{ parser.setEncoding(encoding); } //OrFilter是結合幾種過濾條件的‘或’過濾器
            NodeFilter filter = new RegexFilter(regex); NodeList list = parser.extractAllNodesThatMatch(filter); for(int i=0; i<list.size();i++){ Node node = (Node)list.elementAt(i); System.out.println("link is :" + node.toHtml()); } } catch (Exception e) { e.printStackTrace(); } } /** * 在鏈接地址中進行正則匹配,返回的是Link結點 * * @param url 請求url * @param encoding 字符編碼 * @param regex 待匹配的正則表達式 */
    public static void linkTagRegexFilter(String url,String encoding,String regex){ try { Parser parser = new Parser(); parser.setURL(url); if(null==encoding){ parser.setEncoding(parser.getEncoding()); }else{ parser.setEncoding(encoding); } //OrFilter是結合幾種過濾條件的‘或’過濾器
            NodeFilter filter = new LinkRegexFilter(regex); NodeList list = parser.extractAllNodesThatMatch(filter); for(int i=0; i<list.size();i++){ Node node = (Node)list.elementAt(i); System.out.println("link is :" + node.toHtml()); } } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { String url =  "F:/dennisit/email.txt"; String emailRegex = "[a-zA-Z0-9_-]+@\\w+\\.[a-z]+(\\.[a-z]+)?"; regexStringFilter(url, "UTF-8", emailRegex); System.out.println("-------------------------------------------"); linkTagRegexFilter(url, "UTF-8", emailRegex); }

程序運行結果


轉載請注明出處:[http://www.cnblogs.com/dennisit/p/3191803.html]

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM