<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    分析/解析Html頁面:HTML Parser的試用

    最近在研究lucene的全文檢索,在很多地方需要解析或者說分析Html內容或者Html頁面,Lucene本身的演示程序中也提供了一個Html Parser,但是不是純Java的解決方案.于是到處搜索,在網上找到了一個"HTMLParser".

    網址是: http://htmlparser.sourceforge.net ,當前版本為1.5.

    下載下來,試用一番,感覺不錯,完全能滿足lucene解析Html的需求.

    過幾天貼出lucene進行全文檢索的代碼.(檢索本站的文章等).

    試用代碼如下,供大家參考:

    package com.jscud.test;

    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.InputStreamReader;

    import org.htmlparser.Node;
    import org.htmlparser.NodeFilter;
    import org.htmlparser.Parser;
    import org.htmlparser.filters.NodeClassFilter;
    import org.htmlparser.filters.OrFilter;
    import org.htmlparser.nodes.TextNode;
    import org.htmlparser.tags.LinkTag;
    import org.htmlparser.util.NodeList;
    import org.htmlparser.util.ParserException;
    import org.htmlparser.visitors.HtmlPage;
    import org.htmlparser.visitors.TextExtractingVisitor;

    import com.jscud.util.LogMan; //一個日志記錄類

    /**
     * 演示了Html Parse的應用.
     *
     * @author scud http://www.jscud.com
     */

    public class ParseHtmlTest
    {

        public static void main(String[] args) throws Exception
        {
            String aFile = "e:/jscud/temp/test.htm";

            String content = readTextFile(aFile, "GBK");

            test1(content);
            System.out.println("====================================");

            test2(content);
            System.out.println("====================================");

            test3(content);
            System.out.println("====================================");

            test4(content);
            System.out.println("====================================");

            test5(aFile);
            System.out.println("====================================");

            //訪問外部資源,相對慢
            test5("         System.out.println("====================================");

        }

        /**
         * 讀取文件的方式來分析內容.
         * filePath也可以是一個Url.
         *
         * @param resource 文件/Url
         */
        public static void test5(String resource) throws Exception
        {
            Parser myParser = new Parser(resource);

            //設置編碼
            myParser.setEncoding("GBK");

            HtmlPage visitor = new HtmlPage(myParser);

            myParser.visitAllNodesWith(visitor);

            String textInPage = visitor.getTitle();

            System.out.println(textInPage);
        }

        /**
         * 按頁面方式處理.對一個標準的Html頁面,推薦使用此種方式.
         */
        public static void test4(String content) throws Exception
        {
            Parser myParser;
            myParser = Parser.createParser(content, "GBK");

            HtmlPage visitor = new HtmlPage(myParser);

            myParser.visitAllNodesWith(visitor);

            String textInPage = visitor.getTitle();

            System.out.println(textInPage);
        }

        /**
         * 利用Visitor模式解析html頁面.
         *
         * 小優點:翻譯了<>等符號
         * 缺點:好多空格,無法提取link
         *  
         */
        public static void test3(String content) throws Exception
        {
            Parser myParser;
            myParser = Parser.createParser(content, "GBK");

            TextExtractingVisitor visitor = new TextExtractingVisitor();

            myParser.visitAllNodesWith(visitor);

            String textInPage = visitor.getExtractedText();

            System.out.println(textInPage);
        }

        /**
         * 得到普通文本和鏈接的內容.
         *
         * 使用了過濾條件.
         */
        public static void test2(String content) throws ParserException
        {
            Parser myParser;
            NodeList nodeList = null;

            myParser = Parser.createParser(content, "GBK");

            NodeFilter textFilter = new NodeClassFilter(TextNode.class);
            NodeFilter linkFilter = new NodeClassFilter(LinkTag.class);

            //暫時不處理 meta
            //NodeFilter metaFilter = new NodeClassFilter(MetaTag.class);

            OrFilter lastFilter = new OrFilter();
            lastFilter.setPredicates(new NodeFilter[] { textFilter, linkFilter });

            nodeList = myParser.parse(lastFilter);

            Node[] nodes = nodeList.toNodeArray();

            for (int i = 0; i < nodes.length; i++)
            {
                Node anode = (Node) nodes[i];

                String line = "";
                if (anode instanceof TextNode)
                {
                    TextNode textnode = (TextNode) anode;
                    //line = textnode.toPlainTextString().trim();
                    line = textnode.getText();
                }
                else if (anode instanceof LinkTag)
                {
                    LinkTag linknode = (LinkTag) anode;

                    line = linknode.getLink();
                   
    //@todo 過濾jsp標簽:可以自己實現這個函數
                    //line = StringFunc.replace(line, "<%.*%>", "");
                }

                if (isTrimEmpty(line))
                    continue;

                System.out.println(line);
            }
        }

        /**
         * 解析普通文本節點.
         *
         * @param content
         * @throws ParserException
         */
        public static void test1(String content) throws ParserException
        {
            Parser myParser;
            Node[] nodes = null;

            myParser = Parser.createParser(content, null);

            nodes = myParser.extractAllNodesThatAre(TextNode.class); //exception could be thrown here

            for (int i = 0; i < nodes.length; i++)
            {
                TextNode textnode = (TextNode) nodes[i];
                String line = textnode.toPlainTextString().trim();
                if (line.equals(""))
                    continue;
                System.out.println(line);
            }

        }

        /**
         * 讀取一個文件到字符串里.
         *
         * @param sFileName  文件名
         * @param sEncode   String
         * @return 文件內容
         */
        public static String readTextFile(String sFileName, String sEncode)
        {
            StringBuffer sbStr = new StringBuffer();

            try
            {
                File ff = new File(sFileName);
                InputStreamReader read = new InputStreamReader(new FileInputStream(ff),
                        sEncode);
                BufferedReader ins = new BufferedReader(read);

                String dataLine = "";
                while (null != (dataLine = ins.readLine()))
                {
                    sbStr.append(dataLine);
                    sbStr.append("\r\n");
                }

                ins.close();
            }
            catch (Exception e)
            {
                LogMan.error("read Text File Error", e);
            }

            return sbStr.toString();
        }

        /**
         * 去掉左右空格后字符串是否為空
         * @param astr String
         * @return boolean
         */
        public static boolean isTrimEmpty(String astr)
        {
            if ((null == astr) || (astr.length() == 0))
            {
                return true;
            }
            if (isBlank(astr.trim()))
            {
                return true;
            }
            return false;
        }

        /**
         * 字符串是否為空:null或者長度為0.
         * @param astr 源字符串.
         * @return boolean
         */
        public static boolean isBlank(String astr)
        {
            if ((null == astr) || (astr.length() == 0))
            {
                return true;
            }
            else
            {
                return false;
            }
        }

    }

     


    posted on 2008-01-11 09:45 靈! 閱讀(351) 評論(0)  編輯  收藏 所屬分類: Java專題-詞法解析


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    <2008年1月>
    303112345
    6789101112
    13141516171819
    20212223242526
    272829303112
    3456789

    導航

    統計

    隨筆分類

    隨筆檔案

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 老汉色老汉首页a亚洲| 中文字幕av无码无卡免费| 免费国产成人高清视频网站| 亚洲人成免费电影| 亚洲一卡二卡三卡四卡无卡麻豆| 一本色道久久综合亚洲精品高清| 亚洲成A人片777777| 插鸡网站在线播放免费观看| 亚洲午夜未满十八勿入网站2| 亚洲阿v天堂在线2017免费| 亚洲综合AV在线在线播放| 精品一区二区三区高清免费观看 | 亚洲国产精品专区| 国产精品视频免费观看| 久久久久se色偷偷亚洲精品av | 免费在线视频一区| 国产A∨免费精品视频| 亚洲av无码专区在线播放| 无码囯产精品一区二区免费| 亚洲国产精品成人综合色在线婷婷| 大学生一级毛片免费看| 自拍偷自拍亚洲精品偷一| 亚洲综合色区在线观看| 99久久国产精品免费一区二区| 亚洲午夜久久影院| 免费人成视频在线| 一级毛片免费播放男男| 亚洲AV人无码综合在线观看| 在线观看H网址免费入口| 国产成人精品亚洲| 亚洲AV综合色区无码一区 | 91香蕉成人免费网站| 久久久久亚洲AV无码去区首| 自拍偷自拍亚洲精品被多人伦好爽 | 免费福利视频导航| 美女露隐私全部免费直播| 久久久久久亚洲av成人无码国产| 国内精品乱码卡1卡2卡3免费| 免费的黄色网页在线免费观看| 久久精品夜色国产亚洲av| 青青草国产免费久久久下载|