免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 844 | 回复: 0
打印 上一主题 下一主题

解析Html页面:HTML Parser的试用 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-11-25 16:45 |只看该作者 |倒序浏览
8月19日
解析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("
http://www.jscud.com
");
        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 //@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


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/28528/showart_1665513.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP