<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 靈! 閱讀(350) 評論(0)  編輯  收藏 所屬分類: Java專題-詞法解析


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


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

    導航

    統計

    隨筆分類

    隨筆檔案

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 无码乱人伦一区二区亚洲| 中文亚洲AV片在线观看不卡| 亚洲色偷偷偷网站色偷一区| 国产精品偷伦视频观看免费 | 免费网站看v片在线香蕉| 亚洲最大的黄色网| 午夜时刻免费入口| 国产精品亚洲综合一区在线观看| 国产大片91精品免费看3| 精品久久久久久久久亚洲偷窥女厕| 国产乱子伦精品免费无码专区| 疯狂做受xxxx高潮视频免费| 又大又黄又粗又爽的免费视频| 西西人体大胆免费视频| 亚洲精品无码mv在线观看网站| 黄网站免费在线观看| 久久精品国产亚洲77777| 亚色九九九全国免费视频| 亚洲欧好州第一的日产suv| 免费在线观看理论片| 丝袜足液精子免费视频| 亚洲一区影音先锋色资源| 91在线视频免费看| 国产av无码专区亚洲av毛片搜 | 亚洲精品亚洲人成在线| 亚洲高清最新av网站| 精品免费tv久久久久久久| 亚洲综合校园春色| 亚洲无码精品浪潮| 8x成人永久免费视频| 亚洲AV第一成肉网| 亚洲成AV人在线播放无码| 日韩免费a级毛片无码a∨ | 亚洲一区AV无码少妇电影| 国产精品色午夜免费视频| 你是我的城池营垒免费观看完整版| 亚洲人和日本人jizz| 亚洲人成无码www久久久| 最近中文字幕国语免费完整| 美景之屋4在线未删减免费| 久久被窝电影亚洲爽爽爽|