J2EE社區(qū)

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

          HTML Parser

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

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

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


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

              * org.htmlparser.Node:

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

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

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

          獲取節(jié)點(diǎn)對(duì)應(yīng)的樹(shù)形結(jié)構(gòu)結(jié)構(gòu)的頂級(jí)節(jié)點(diǎn)Page對(duì)象方法:getPage

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

          Visitor方法遍歷節(jié)點(diǎn)時(shí)候方法:accept (NodeVisitor visitor)

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

          Object方法:toString、clone

              * org.htmlparser.nodes.AbstractNode:

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

          在htmlparser中,Node分成三類(lèi):

          RemarkNode:代表Html中的注釋

          TagNode:標(biāo)簽節(jié)點(diǎn)。

          TextNode:文本節(jié)點(diǎn)

          這三類(lèi)節(jié)點(diǎn)都繼承AbstractNode。

              * org.htmlparser.nodes.TagNode:

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

          復(fù)合節(jié)點(diǎn)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é)點(diǎn)TAG:

          BaseHrefTag,DoctypeTag,FrameTag,ImageTag,InputTag,JspTag,MetaTag,ProcessingInstructionTag,
          2、htmlparser對(duì)html頁(yè)面處理的算法

          主要是如下幾種方式

              * 采用Visitor方式訪問(wèn)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方式訪問(wèn)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):通過(guò)NodeFilter方式獲取
              * visitAllNodesWith (NodeVisitor visitor):通過(guò)Nodevisitor方式
              * extractAllNodesThatMatch (NodeFilter filter):通過(guò)NodeFilter方式

          org.htmlparser
          定義了htmlparser的一些基礎(chǔ)類(lèi)。其中最為重要的是Parser類(lèi)。
              Parser是htmlparser的最核心的類(lèi),其構(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
          對(duì)Visitor和Filter的方法進(jìn)行了封裝,定義了針對(duì)一些常用html元素操作的bean,簡(jiǎn)化對(duì)常用元素的提取操作。
              包括: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,主要通過(guò)extractAllNodesThatMatch (NodeFilter filter)來(lái)對(duì)html頁(yè)面指定類(lèi)型的元素進(jìn)行過(guò)濾,包括:AndFilter、CssSelectorNodeFilter、 HasAttributeFilter、HasChildFilter、HasParentFilter、HasSiblingFilter、 IsEqualFilter、LinkRegexFilter、LinkStringFilter、NodeClassFilter、 NotFilter、OrFilter、RegexFilter、StringFilter、TagNameFilter、XorFilter

          3.6、org.htmlparser.visitors
             定義了htmlparser所提供的各種visitor,主要通過(guò)visitAllNodesWith (NodeVisitor visitor)來(lái)對(duì)html頁(yè)面元素進(jìn)行遍歷,包括:HtmlPage、LinkFindingVisitor、NodeVisitor、 ObjectFindingVisitor、StringFindingVisitor、TagFindingVisitor、 TextExtractingVisitor、UrlModifyingVisitor

           

          3.7、org.htmlparser.parserapplications
             定義了一些實(shí)用的工具,包括LinkExtractor、SiteCapturer、StringExtractor、WikiCapturer,這幾個(gè)類(lèi)也可以作為htmlparser使用樣例。

          3.8、org.htmlparser.tests
             對(duì)各種功能的單元測(cè)試用例,也可以作為htmlparser使用的樣例。

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




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


          主站蜘蛛池模板: 黔南| 昭苏县| 谢通门县| 兴文县| 宿松县| 远安县| 育儿| 壤塘县| 灵台县| 集贤县| 大英县| 景洪市| 米易县| 甘洛县| 理塘县| 安陆市| 上高县| 兖州市| 石景山区| 慈利县| 鄂托克前旗| 绩溪县| 青州市| 邢台市| 都兰县| 双峰县| 敦化市| 平凉市| 金山区| 东港市| 仁布县| 漳浦县| 榆中县| 芦溪县| 郴州市| 万盛区| 永胜县| 临朐县| 新野县| 汉寿县| 上栗县|