J2EE社区

苟有恒,何必三更起五更眠;
最无益,只怕一日曝十日寒.
posts - 241, comments - 318, trackbacks - 0, articles - 16

HTML Parser

Posted on 2010-06-08 00:22 xcp 阅读(737) 评论(0)  编辑  收藏 所属分类: JAVA

实例:http://bbs.sinobuy.cn/index.php/topic,29082.msg48061.html?PHPSESSID=25765715740d5ea729db953abfa52679

研究的重点还是extraction的使用,有空再研究transformation的使用。
1、htmlparser对html页面处理的数据结构


如图所示,HtmlParser采用了经典的Composite模式,通过RemarkNode、TextNode、TagNode、AbstractNode和Tag来描述HTML页面各元素。

    * org.htmlparser.Node:

Node接口定义了进行树形结构节点操作的各种典型操作方法,包括:

节点到html文本、text文本的方法:toPlainTextString、toHtml

典型树形结构遍历的方法:getParent、getChildren、getFirstChild、getLastChild、getPreviousSibling、getNextSibling、getText

获取节点对应的树形结构结构的顶级节点Page对象方法:getPage

获取节点起始位置的方法:getStartPosition、getEndPosition

Visitor方法遍历节点时候方法:accept (NodeVisitor visitor)

Filter方法:collectInto (NodeList list, NodeFilter filter)

Object方法:toString、clone

    * org.htmlparser.nodes.AbstractNode:

AbstractNode是形成HTML树形结构抽象基类,实现了Node接口。

在htmlparser中,Node分成三类:

RemarkNode:代表Html中的注释

TagNode:标签节点。

TextNode:文本节点

这三类节点都继承AbstractNode。

    * org.htmlparser.nodes.TagNode:

TagNode包含了对HTML处理的核心的各个类,是所有TAG的基类,其中有分为包含其他TAG的复合节点ComositeTag和不包含其他TAG的叶子节点Tag。

复合节点CompositeTag:

AppletTag,BodyTag,Bullet,BulletList,DefinitionList,DefinitionListBullet,Div,FormTag,FrameSetTag,HeadingTag,

HeadTag,Html,LabelTag,LinkTag,ObjectTag,ParagraphTag,ScriptTag,SelectTag,Span,StyleTag,TableColumn,

TableHeader,TableRow,TableTag,TextareaTag,TitleTag

叶子节点TAG:

BaseHrefTag,DoctypeTag,FrameTag,ImageTag,InputTag,JspTag,MetaTag,ProcessingInstructionTag,
2、htmlparser对html页面处理的算法

主要是如下几种方式

    * 采用Visitor方式访问Html

    public static void testVisitorAll()
    {
        try
        {
            Parser parser = new Parser();
            parser.setURL("http://www.google.com");
            parser.setEncoding(parser.getEncoding());
            NodeVisitor visitor = new NodeVisitor()
            {
                public void visitTag(Tag tag)
                {
                    logger.info("testVisitorAll() Tag name is :" + tag.getTagName() + " Class is :" + tag.getClass());
                }

            };
            parser.visitAllNodesWith(visitor);
        } catch (ParserException e)
        {
            e.printStackTrace();
        }
    }

    * 采用Filter方式访问html

    public static void testLinkTag()
    {
        try
        {
            NodeFilter filter = new NodeClassFilter(LinkTag.class);
            Parser parser = new Parser();
            parser.setURL("http://www.google.com");
            parser.setEncoding(parser.getEncoding());
            NodeList list = parser.extractAllNodesThatMatch(filter);
            for (int i = 0; i < list.size(); i++)
            {
                LinkTag node = (LinkTag) list.elementAt(i);
                logger.fatal("testLinkTag() Link is :" + node.extractLink());
            }
        } catch (Exception e)
        {
            e.printStackTrace();
        }
    }

    * 采用org.htmlparser.beans方式

    public static void testLinkBean()
    {
        Parser parser = new Parser();

        LinkBean linkBean = new LinkBean();
        linkBean.setURL("http://www.google.com");
        URL[] urls = linkBean.getLinks();

        for (int i = 0; i < urls.length; i++)
        {
            URL url = urls[i];
            logger.fatal("testLinkBean() -url is :" + url);
        }
    }

    * parse (NodeFilter filter):通过NodeFilter方式获取
    * visitAllNodesWith (NodeVisitor visitor):通过Nodevisitor方式
    * extractAllNodesThatMatch (NodeFilter filter):通过NodeFilter方式

org.htmlparser
定义了htmlparser的一些基础类。其中最为重要的是Parser类。
    Parser是htmlparser的最核心的类,其构造函数提供了如下:Parser.createParser (String html, String charset)、 Parser ()、Parser (Lexer lexer, ParserFeedback fb)、Parser (URLConnection connection, ParserFeedback fb)、Parser (String resource, ParserFeedback feedback)、 Parser (String resource)

org.htmlparser.beans
对Visitor和Filter的方法进行了封装,定义了针对一些常用html元素操作的bean,简化对常用元素的提取操作。
    包括:FilterBean、HTMLLinkBean、HTMLTextBean、LinkBean、StringBean、BeanyBaby等。

3.3、org.htmlparser.nodes
    定义了基础的node,包括:AbstractNode、RemarkNode、TagNode、TextNode等。

3.4、org.htmlparser.tags
    定义了htmlparser的各种tag。

3.5、org.htmlparser.filters
    定义了htmlparser所提供的各种filter,主要通过extractAllNodesThatMatch (NodeFilter filter)来对html页面指定类型的元素进行过滤,包括:AndFilter、CssSelectorNodeFilter、 HasAttributeFilter、HasChildFilter、HasParentFilter、HasSiblingFilter、 IsEqualFilter、LinkRegexFilter、LinkStringFilter、NodeClassFilter、 NotFilter、OrFilter、RegexFilter、StringFilter、TagNameFilter、XorFilter

3.6、org.htmlparser.visitors
   定义了htmlparser所提供的各种visitor,主要通过visitAllNodesWith (NodeVisitor visitor)来对html页面元素进行遍历,包括:HtmlPage、LinkFindingVisitor、NodeVisitor、 ObjectFindingVisitor、StringFindingVisitor、TagFindingVisitor、 TextExtractingVisitor、UrlModifyingVisitor

 

3.7、org.htmlparser.parserapplications
   定义了一些实用的工具,包括LinkExtractor、SiteCapturer、StringExtractor、WikiCapturer,这几个类也可以作为htmlparser使用样例。

3.8、org.htmlparser.tests
   对各种功能的单元测试用例,也可以作为htmlparser使用的样例。

文章出处:飞诺网(www.firnow.com):http://dev.firnow.com/course/3_program/java/javajs/20091021/179713.html




名称: ♪4C.ESL | .↗Evon
口号: 遇到新问题♪先要寻找一个方案乄而不是创造一个方案こ
mail: 联系我



只有注册用户登录后才能发表评论。


网站导航: