HtmlParser的使用-爬蟲學習(三)

  關於這個HtmlParser的學習資料,網上真的很匱乏,這個好用的東西不要浪費啊,因此我在這裏隆重的介紹一下。html

  HtmlParser是一個用來解析HTML文件的Java包,主要用於轉換盒抽取兩個方面。node

  利用HtmlParser,你能夠實現下面的內容的抽取:框架

  a.文本抽取  b.連接抽取  c.資源抽取。能夠蒐集到圖像和聲音文件等資源工具

  d.連接檢查。保證連接是有用的  e.站點檢查,能夠查看頁面不一樣版本之間的差別學習

  利用HtmlParser,你能夠利用它的轉換功能,主要體如今幾個方面:測試

  a.URL重寫。可以修正頁面中的錯誤連接  b.廣告清楚。清除頁面中的廣告內容和指向廣告的連接ui

  c.將HTML頁面轉化成XML頁面  d.HTML頁面的清理google

  

  咱們開始學習了,咱們先來看看這個包中的類的大致框架:編碼

              

  在org.htmlparser包下,有幾個接口和類:spa

    Parser類:這個是HtmlParser的核心類,主要的完成對Html頁面的分析工具,經過這個類咱們能夠獲得這個頁面的各類信息。

      Parser():無參數的構造方法。

      Parser(String resource):根據String參數構建對象,這個參數能夠是URL或者本地文件的路徑。

      Parser(URLConnection connection):根據一個URLConnection對象構建對象。

      createParser(String html, String charset):經過路徑名建立對象,而且設置編碼格式。

      elements():返回這個類的元素節點的迭代器,經過這個迭代器咱們遍歷頁面的節點。

      setURL():設置這個Parser類要解析的頁面的地址。

      parset():根據一個NodeFilter,也就是一個過濾器去獲取過濾剩下的頁面信息。

      visitAllNodeWith(NodeVisitor visitor):經過一個NodeVisitor去遍歷全部的節點。

  小試牛刀(這個只是簡單的使用,具體的類看下面的介紹):

    @Test
    public void testVisitAllNodeWith() throws Exception {
        Parser parser = new Parser();
        parser.setURL("http://www.google.cn");
        parser.setEncoding(parser.getEncoding());
        NodeVisitor visitor = new NodeVisitor() {
            public void visitTag(Tag tag) {
                System.out.println("*************************");
                System.out.println(tag.getTagName());
                System.out.println("*************************");
            }
        };
        parser.visitAllNodesWith(visitor);
        
    }
    
    @Test
    public void testElements() throws Exception {
        Parser parser = new Parser();
        parser.setURL("http://www.google.cn");
        parser.setEncoding(parser.getEncoding());
        NodeIterator iterator = parser.elements();
        while(iterator.hasMoreNodes()) {
            Node node = iterator.nextNode();
            System.out.println("*************************");
            System.out.println(node.getText());
            System.out.println("*************************");
        }
    }

    Node接口:這個接口就好像定義了一顆樹來表示一個HTML頁面,定義獲取父子兄弟節點的方法,定義了節點到對應節點的html文本的方法,從上面的圖中咱們看到有AbstractNode這個類,這個是Node的實現類,起到造成樹形結構的做用,在HTML頁面中有三種類型的Node,RemarkNode表明html中的註釋,TagNode表明標籤節點,TextNode表明文本節點。

      getChildren():獲取子節點,返回一個NodeList對象。

      getFirstChildren():獲取第一個子節點,返回一個Node對象。

      getLastChildren():獲取最後一個子節點,返回一個Node對象。

      getPreviousSibling():獲取前一個兄弟節點。

      getNextSibling():獲取後一個兄弟節點。

      getParent():獲取父節點。

      getText():得到文本內容。

      toPlainTextString():獲取純文本信息。

      toHtml():獲取Html信息。

      accept(NodeVisitor visitor):對這個node應用visitor。

爲了方法你們觀看,仍是本身寫一個Html,而後練練方法:

node.html

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Title Node</title>
    </head>
    <body>
        <!-- remark -->
        <h1>H1 Node</h1>
        <div id="d1">
            <div id="d2">
                <a>Div Node</a>
            </div>
        </div>
    </body>
</html>

 測試方法:

    @Test
    public void testNode() throws Exception {
        Parser parser = new Parser();
        parser.setURL("src/node.html");
        parser.setEncoding(parser.getEncoding());
        NodeIterator iterator = parser.elements();
        while(iterator.hasMoreNodes()) {
            Node node = iterator.nextNode();
            System.out.println("*************************");
            System.out.println("Text:" + node.getText());
            System.out.println("PlainText:" + node.toPlainTextString());
            System.out.println("ToHtml:" + node.toHtml());
            System.out.println("*************************");
        }
    }

 

    Remark接口:這個接口表明了註釋。實現類有RemarkNode,這個類表明了註釋節點。

      getText():獲取文本。

      setText():設置文本。

    Tag接口:這個接口就表明了Html頁面的標籤,實現類有TagNode,就是標籤節點。

      getAttribute(String name):根據name拿到該標籤的屬性,固然有對應的setAttribute方法。

      getTagName():拿到這個標籤的名字。

      toTagHtml():返回這個標籤的html。

    Text接口:這個接口表明Html的文本,實現類有TextNode,就是文本節點。

      getText():拿到文本值。

      setText():設置文本值。

    NodeFilter接口:這個接口定義的是過濾器,經過各類各樣的過濾器能夠篩選出特定的節點,具體的應用看下面的org.htmlparser.filters包下的類的應用,

      accept(Node node):這個方法的返回值是boolean,方法的做用就是判斷要不要保留這個節點。

 

  在org.htmlparser.visitors包下,有一個很重要的類NodeVisitor,下面講解一下:

    NodeVisitor類:經過這個visitor咱們能夠遍歷樹的每個節點,對於一個符合條件的節點,咱們還能夠進行適當的處理。

      visitRemarkNode(Remark remark):訪問remark類型的節點,經過重寫這個方法能夠實現對這個remark類型節點的特定操做。

      visitStringNode(Text text):訪問Text類型的節點,經過重寫這個方法能夠實現對這個Text類型節點的特定操做。

      visitTag(Tag tag):訪問Tag類型的節點,經過重寫這個方法能夠實現對這個Tag類型節點的特定操做。

小試牛刀:

public class MyVisitor extends NodeVisitor{
    public MyVisitor() {    
    }
    
    public void visitTag(Tag tag) {
        if(tag.getTagName().equals("BODY"))
            System.out.println("**********body**************");
        System.out.println("TagName:" + tag.getTagName());
    }
    
    public void visitStringNode(Text text) {
        System.out.println("text" + text.getText());
    }
    
    public static void main(String[] args) throws Exception{
        Parser parser = new Parser("src/node.html");
        MyVisitor visitor = new MyVisitor();
        parser.visitAllNodesWith(visitor);
        
    }
}

 

  在org.htmlparset.filters包下,有着不少過濾器,每一個過濾器類都有本身特定的做用:

    判斷類Filter:

      TagNameFilter

      HasAttributeFilter

      HasChildFilter

      HasParentFilter

      HasSiblingFilter

      IsEqualFilter

    邏輯運算Filter:

      AndFilter

      NotFilter

      OrFilter

      XorFilter

    其餘Filter:

      NodeClassFilter

      StringFilter

      LinkStringFilter

      LinkRegexFilter

      RegexFilter

      CssSelectorNodeFilter

下面是一個關於TagNameFilter的小試牛刀:

    @Test
    public void testTagNameFilter() throws Exception{
        Parser parser = new Parser("src/node.html");
        NodeFilter filter = new TagNameFilter("DIV");
        NodeList nodeList = parser.extractAllNodesThatMatch(filter);
        if(nodeList != null) {
            for(int i = 0; i < nodeList.size(); i++) {
                Node node = nodeList.elementAt(i);
                System.out.println("Text:" + node.getText());
                System.out.println("****************************");
            }
        }
    }
相關文章
相關標籤/搜索