J2EE社區(qū)

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

          HTML Parser

          Posted on 2010-06-08 00:22 xcp 閱讀(756) 評論(0)  編輯  收藏 所屬分類: JAVA

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

          研究的重點還是extraction的使用,有空再研究transformation的使用。
          1、htmlparser對html頁面處理的數(shù)據(jù)結(jié)構(gòu)


          如圖所示,HtmlParser采用了經(jīng)典的Composite模式,通過RemarkNode、TextNode、TagNode、AbstractNode和Tag來描述HTML頁面各元素。

              * org.htmlparser.Node:

          Node接口定義了進行樹形結(jié)構(gòu)節(jié)點操作的各種典型操作方法,包括:

          節(jié)點到html文本、text文本的方法:toPlainTextString、toHtml

          典型樹形結(jié)構(gòu)遍歷的方法:getParent、getChildren、getFirstChild、getLastChild、getPreviousSibling、getNextSibling、getText

          獲取節(jié)點對應(yīng)的樹形結(jié)構(gòu)結(jié)構(gòu)的頂級節(jié)點Page對象方法:getPage

          獲取節(jié)點起始位置的方法:getStartPosition、getEndPosition

          Visitor方法遍歷節(jié)點時候方法:accept (NodeVisitor visitor)

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

          Object方法:toString、clone

              * org.htmlparser.nodes.AbstractNode:

          AbstractNode是形成HTML樹形結(jié)構(gòu)抽象基類,實現(xiàn)了Node接口。

          在htmlparser中,Node分成三類:

          RemarkNode:代表Html中的注釋

          TagNode:標簽節(jié)點。

          TextNode:文本節(jié)點

          這三類節(jié)點都繼承AbstractNode。

              * org.htmlparser.nodes.TagNode:

          TagNode包含了對HTML處理的核心的各個類,是所有TAG的基類,其中有分為包含其他TAG的復(fù)合節(jié)點ComositeTag和不包含其他TAG的葉子節(jié)點Tag。

          復(fù)合節(jié)點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

          葉子節(jié)點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的一些基礎(chǔ)類。其中最為重要的是Parser類。
              Parser是htmlparser的最核心的類,其構(gòu)造函數(shù)提供了如下: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
              定義了基礎(chǔ)的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使用的樣例。

          文章出處:飛諾網(wǎng)(www.firnow.com):http://dev.firnow.com/course/3_program/java/javajs/20091021/179713.html




          名稱: ?4C.ESL | .↗Evon
          口號: 遇到新問題?先要尋找一個方案乄而不是創(chuàng)造一個方案こ
          mail: 聯(lián)系我


          主站蜘蛛池模板: 阳泉市| 洛川县| 桂阳县| 木里| 珲春市| 博客| 怀柔区| 合江县| 英超| 二连浩特市| 宁安市| 昭平县| 万山特区| 安塞县| 堆龙德庆县| 定陶县| 保康县| 文山县| 武宣县| 南平市| 邢台市| 同心县| 正阳县| 原平市| 黄陵县| 七台河市| 塔城市| 宣城市| 宜君县| 武川县| 安丘市| 越西县| 定兴县| 五大连池市| 墨脱县| 青河县| 宁强县| 华阴市| 留坝县| 北碚区| 华蓥市|