天天看點

HTMLParser的HasAttributeFilter過濾方式分析網頁

HTMLParser 在分析網頁的時候有兩種方式,一種是Visitor方式另外一種是Filter方式。

在這裡我們看看使用filter分析網頁資訊的方法。

使用Filter方式通路網頁,目的就是提取網頁上的節點。在這裡我們就可以使用HasAttributeFilter來進行分析。例如,我們要在百度上查詢www.javaeerun.com的收錄情況,那麼根據上一篇文章 簡單收錄查詢工具的原理  我們知道了要通路的URL和需要擷取的節點,那麼接下來就以此為例。

有這麼幾步是固定的:

Parser parser = new Parser((HttpURLConnection) new URL(url).openConnection());

NodeFilter filter = new HasAttributeFilter(attrName, attrValue);

NodeList nodeList = parser.extractAllNodesThatMatch(filter);

這樣我們就已經獲得了具有attrName=attrValue的NodeList了,接下來就是對Node的處理了

代碼如下:

package com.javaeerun.demo.HTMLparserdemo.filter;
 
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
 
import org.htmlparser.Node;
import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.filters.HasAttributeFilter;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;
 
public class HasAttributeFilterDemo {
    public static void main(String[] args) {
        try {
            Parser parser = new Parser(
                    (HttpURLConnection) new URL("http://www.baidu.com/s?"
                            + "wd=site%3Awww.javaeerun.com").
                            openConnection());
            parser.setEncoding("GBK");
            NodeFilter filter = new HasAttributeFilter("class", "nums");
            NodeList nodeList = parser.extractAllNodesThatMatch(filter);
 
            if (nodeList != null && nodeList.size() > 0) {
                Node node = nodeList.elementAt(0);
                // 擷取class="nums"的span
                System.out.println(node.toHtml());
                NodeList nl = node.getChildren();
                Node textNode = nl.elementAt(0);
                // 擷取Text節點
                System.out.println(textNode.getText());
 
            }
        } catch (ParserException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
           

 這樣,我們就獲得了這樣的結果:

百度為您找到相關結果N個

這裡的N是數字,具有xxx,xxx,xxx的格式。我們要做的處理就是把這個字元串當中非數字部分全部去掉然後拼接起來就可以了,這裡就不做示範了。

本文轉自JAVAEERun.com 轉載請注明