分析/解析Html页面:HTML Parser的试用

转载自: http://www.jscud.com/srun/news/viewhtml/2_2005_8/71.htm

 

最近在研究lucene的全文检索,在很多地方需要解析或者说分析Html内容或者Html页面,Lucene本身的演示程序中也提供了一个Html Parser,但是不是纯Java的解决方案.于是到处搜索,在网上找到了一个"HTMLParser".

网址是: http://htmlparser.sourceforge.net ,当前版本为1.5.

下载下来,试用一番,感觉不错,完全能满足lucene解析Html的需求.

过几天贴出lucene进行全文检索的代码.(检索本站的文章等).

试用代码如下,供大家参考:

java 代码
  1. package com.jscud.test;   
  2.   
  3. import java.io.BufferedReader;   
  4. import java.io.File;   
  5. import java.io.FileInputStream;   
  6. import java.io.InputStreamReader;   
  7.   
  8. import org.htmlparser.Node;   
  9. import org.htmlparser.NodeFilter;   
  10. import org.htmlparser.Parser;   
  11. import org.htmlparser.filters.NodeClassFilter;   
  12. import org.htmlparser.filters.OrFilter;   
  13. import org.htmlparser.nodes.TextNode;   
  14. import org.htmlparser.tags.LinkTag;   
  15. import org.htmlparser.util.NodeList;   
  16. import org.htmlparser.util.ParserException;   
  17. import org.htmlparser.visitors.HtmlPage;   
  18. import org.htmlparser.visitors.TextExtractingVisitor;   
  19.   
  20. import com.jscud.util.LogMan; //一个日志记录类   
  21.   
  22. /**  
  23.  * 演示了Html Parse的应用.  
  24.  *   
  25.  * @author scud http://www.jscud.com  
  26.  */  
  27.   
  28. public class ParseHtmlTest   
  29. {   
  30.   
  31.     public static void main(String[] args) throws Exception   
  32.     {   
  33.         String aFile = "e:/jscud/temp/test.htm";   
  34.   
  35.         String content = readTextFile(aFile, "GBK");   
  36.   
  37.         test1(content);   
  38.         System.out.println("====================================");   
  39.   
  40.         test2(content);   
  41.         System.out.println("====================================");   
  42.   
  43.         test3(content);   
  44.         System.out.println("====================================");   
  45.   
  46.         test4(content);   
  47.         System.out.println("====================================");   
  48.   
  49.         test5(aFile);   
  50.         System.out.println("====================================");   
  51.   
  52.         //访问外部资源,相对慢   
  53.         test5("http://www.jscud.com");    
  54.         System.out.println("====================================");   
  55.   
  56.     }   
  57.   
  58.     /**  
  59.      * 读取文件的方式来分析内容.  
  60.      * filePath也可以是一个Url.  
  61.      *   
  62.      * @param resource 文件/Url  
  63.      */  
  64.     public static void test5(String resource) throws Exception   
  65.     {   
  66.         Parser myParser = new Parser(resource);   
  67.   
  68.         //设置编码   
  69.         myParser.setEncoding("GBK");   
  70.   
  71.         HtmlPage visitor = new HtmlPage(myParser);   
  72.   
  73.         myParser.visitAllNodesWith(visitor);   
  74.   
  75.         String textInPage = visitor.getTitle();   
  76.   
  77.         System.out.println(textInPage);   
  78.     }   
  79.   
  80.     /**  
  81.      * 按页面方式处理.对一个标准的Html页面,推荐使用此种方式.  
  82.      */  
  83.     public static void test4(String content) throws Exception   
  84.     {   
  85.         Parser myParser;   
  86.         myParser = Parser.createParser(content, "GBK");   
  87.   
  88.         HtmlPage visitor = new HtmlPage(myParser);   
  89.   
  90.         myParser.visitAllNodesWith(visitor);   
  91.   
  92.         String textInPage = visitor.getTitle();   
  93.   
  94.         System.out.println(textInPage);   
  95.     }   
  96.   
  97.     /**  
  98.      * 利用Visitor模式解析html页面.  
  99.      *  
  100.      * 小优点:翻译了<>等符号   
  101.      * 缺点:好多空格,无法提取link  
  102.      *     
  103.      */  
  104.     public static void test3(String content) throws Exception   
  105.     {   
  106.         Parser myParser;   
  107.         myParser = Parser.createParser(content, "GBK");   
  108.   
  109.         TextExtractingVisitor visitor = new TextExtractingVisitor();   
  110.   
  111.         myParser.visitAllNodesWith(visitor);   
  112.   
  113.         String textInPage = visitor.getExtractedText();   
  114.   
  115.         System.out.println(textInPage);   
  116.     }   
  117.   
  118.     /**  
  119.      * 得到普通文本和链接的内容.  
  120.      *   
  121.      * 使用了过滤条件.  
  122.      */  
  123.     public static void test2(String content) throws ParserException   
  124.     {   
  125.         Parser myParser;   
  126.         NodeList nodeList = null;   
  127.   
  128.         myParser = Parser.createParser(content, "GBK");   
  129.   
  130.         NodeFilter textFilter = new NodeClassFilter(TextNode.class);   
  131.         NodeFilter linkFilter = new NodeClassFilter(LinkTag.class);   
  132.   
  133.         //暂时不处理 meta   
  134.         //NodeFilter metaFilter = new NodeClassFilter(MetaTag.class);   
  135.   
  136.         OrFilter lastFilter = new OrFilter();   
  137.         lastFilter.setPredicates(new NodeFilter[] { textFilter, linkFilter });   
  138.   
  139.         nodeList = myParser.parse(lastFilter);   
  140.   
  141.         Node[] nodes = nodeList.toNodeArray();   
  142.   
  143.         for (int i = 0; i < nodes.length; i++)   
  144.         {   
  145.             Node anode = (Node) nodes[i];   
  146.   
  147.             String line = "";   
  148.             if (anode instanceof TextNode)   
  149.             {   
  150.                 TextNode textnode = (TextNode) anode;   
  151.                 //line = textnode.toPlainTextString().trim();   
  152.                 line = textnode.getText();   
  153.             }   
  154.             else if (anode instanceof LinkTag)   
  155.             {   
  156.                 LinkTag linknode = (LinkTag) anode;   
  157.   
  158.                 line = linknode.getLink();   
  159.                 //@todo 过滤jsp标签:可以自己实现这个函数   
  160.                 //line = StringFunc.replace(line, "<%.*%>", "");   
  161.             }   
  162.   
  163.             if (isTrimEmpty(line))   
  164.                 continue;   
  165.   
  166.             System.out.println(line);   
  167.         }   
  168.     }   
  169.   
  170.     /**  
  171.      * 解析普通文本节点.  
  172.      *   
  173.      * @param content  
  174.      * @throws ParserException  
  175.      */  
  176.     public static void test1(String content) throws ParserException   
  177.     {   
  178.         Parser myParser;   
  179.         Node[] nodes = null;   
  180.   
  181.         myParser = Parser.createParser(content, null);   
  182.   
  183.         nodes = myParser.extractAllNodesThatAre(TextNode.class); //exception could be thrown here   
  184.   
  185.         for (int i = 0; i < nodes.length; i++)   
  186.         {   
  187.             TextNode textnode = (TextNode) nodes[i];   
  188.             String line = textnode.toPlainTextString().trim();   
  189.             if (line.equals(""))   
  190.                 continue;   
  191.             System.out.println(line);   
  192.         }   
  193.   
  194.     }   
  195.   
  196.     /**  
  197.      * 读取一个文件到字符串里.  
  198.      *   
  199.      * @param sFileName  文件名  
  200.      * @param sEncode   String  
  201.      * @return 文件内容  
  202.      */  
  203.     public static String readTextFile(String sFileName, String sEncode)   
  204.     {   
  205.         StringBuffer sbStr = new StringBuffer();   
  206.   
  207.         try  
  208.         {   
  209.             File ff = new File(sFileName);   
  210.             InputStreamReader read = new InputStreamReader(new FileInputStream(ff),   
  211.                     sEncode);   
  212.             BufferedReader ins = new BufferedReader(read);   
  213.   
  214.             String dataLine = "";   
  215.             while (null != (dataLine = ins.readLine()))   
  216.             {   
  217.                 sbStr.append(dataLine);   
  218.                 sbStr.append("\r\n");   
  219.             }   
  220.   
  221.             ins.close();   
  222.         }   
  223.         catch (Exception e)   
  224.         {   
  225.             LogMan.error("read Text File Error", e);   
  226.         }   
  227.   
  228.         return sbStr.toString();   
  229.     }   
  230.   
  231.     /**  
  232.      * 去掉左右空格后字符串是否为空  
  233.      * @param astr String  
  234.      * @return boolean  
  235.      */  
  236.     public static boolean isTrimEmpty(String astr)   
  237.     {   
  238.         if ((null == astr) || (astr.length() == 0))   
  239.         {   
  240.             return true;   
  241.         }   
  242.         if (isBlank(astr.trim()))   
  243.         {   
  244.             return true;   
  245.         }   
  246.         return false;   
  247.     }   
  248.   
  249.     /**  
  250.      * 字符串是否为空:null或者长度为0.  
  251.      * @param astr 源字符串.  
  252.      * @return boolean  
  253.      */  
  254.     public static boolean isBlank(String astr)   
  255.     {   
  256.         if ((null == astr) || (astr.length() == 0))   
  257.         {   
  258.             return true;   
  259.         }   
  260.         else  
  261.         {   
  262.             return false;   
  263.         }   
  264.     }   
  265.   
  266. }   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值