2013年9月6日 星期五

htmlparser過濾網頁純文字


     這是一個網頁純文字的剖析器,一般常用的方法是抓取網頁原始碼,並利用RegularExpression來過濾掉標籤取得想要文字,但門檻較高,故此介紹一個好用的套件=>htmlparser,利用此套件過濾出純文字後,便可根據設計者需求抓取符合格式之文字。
    (一)首先下載htmlparser套件:htmlparser Download
    (二)匯入套件

    (三)撰寫myhtmlparser.class來進行過濾

import org.htmlparser.*;
import org.htmlparser.filters.*;
import org.htmlparser.nodes.*;
import org.htmlparser.util.*;
import org.htmlparser.visitors.*;
public class myhtmlparser {
    private String Content = "";
    private String ErrorMsg = "";
    public myhtmlparser(String link, String StartWord, String EndWord) {
        Content = "";
        ErrorMsg = "";
        try {
            Parser parser = new Parser(link);//剖析連結
            parser.setEncoding("UTF-8");//設定編碼
            HtmlPage htmlpage = new HtmlPage(parser);
            parser.visitAllNodesWith(htmlpage);//拜訪節點
            String body = htmlpage.getBody().toHtml();
            NodeList nodeList = null;
            Parser nodesParser = Parser.createParser(body, "UTF-8");
            NodeFilter textFilter = new NodeClassFilter(TextNode.class);
            try {
                nodeList = nodesParser.parse(textFilter);
            } catch (ParserException e) {
                e.printStackTrace();
            }
            Node[] nodes = nodeList.toNodeArray();//標籤節點轉為節點陣列
            boolean flag = false;
            for (int i = 0; i < nodes.length; i++) {
                Node nextNode = (Node) nodes[i];
                String content = "";
                if (nextNode instanceof TextNode) {
                    TextNode textnode = (TextNode) nextNode;
                    content = textnode.getText();//取得文字
                    content = content.trim();
                    if (StartWord.equals("") && EndWord.equals("")) {//空白則換行
                        Content += content + "\n";
                    } else {
                        if (flag) Content += content + "\n";                                                    
                        if (content.equals(StartWord)) {//自起始字串起開始抓取
                            flag = true;
                            Content += content + "\n";
                            continue;
                        }
                        if (content.equals(EndWord)) break;                                                 
                    }
                }
            }
            Content = Content.replaceAll(" ", " ");//取代空白
            Content = Content.replaceAll("–", "-");//取代-

        } catch (ParserException ex) {
            ErrorMsg = "輸入網址錯誤";           
        }
    }

    public String getContent() {
        return Content;
    }

    public String getErrorMsg() {
        return ErrorMsg;
    }
}

      (四)設計畫面

     (五)抓取網頁內容
private void Grab() {//抓取純文字
        String url = this.urlTxt.getText();             
        parser = new myhtmlparser(url, "", "");
        if (url.equals("")) return;
        if (parser.getErrorMsg().equals("")){
            this.jTextArea1.setText(parser.getContent());          
        }else{
            this.jTextArea1.setText(parser.getErrorMsg());
        }
    }
      (六)過濾網頁內容
 private void Tack() {//過濾純文字
        String url = this.urlTxt.getText();       
        String StartWord = this.startText.getText();
        String EndWord = this.endText.getText();
        parser = new myhtmlparser(url, StartWord, EndWord);
        if (parser.getErrorMsg().equals(""))  this.jTextArea1.setText(parser.getContent());          
        else this.jTextArea1.setText(parser.getErrorMsg());
 }
      (七)存檔
private void Store(){//存檔
        JFileChooser jf = new JFileChooser(".");//根目錄     
        jf.setDialogTitle("請選擇儲存資料夾");    
        jf.setSelectedFile(new File("Grab.txt"));
        if (jf.showSaveDialog(null) != JFileChooser.APPROVE_OPTION) return;        
         String sWay = jf.getSelectedFile().getAbsolutePath();//路徑       
        try {
            File fSave = new File(sWay);
            PrintWriter pw = new PrintWriter(fSave);
            pw.write(parser.getContent());
            pw.close();
            this.jTextArea1.setText("存檔完畢存檔路徑為:" + sWay);
        } catch (FileNotFoundException ex) {
            this.jTextArea1.setText("檔案名稱錯誤");
        }
}
   (八)擷取奇摩字典畫面

      (九)範例程式下載

沒有留言:

張貼留言