htmlparser使用指南_第1頁(yè)
htmlparser使用指南_第2頁(yè)
htmlparser使用指南_第3頁(yè)
htmlparser使用指南_第4頁(yè)
htmlparser使用指南_第5頁(yè)
已閱讀5頁(yè),還剩12頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、.需要做一個(gè)垂直搜索引擎,比較了nekohtml和htmlparser 的功能,盡管nekohtml在容錯(cuò)性、性能等方面的口碑好像比htmlparser好(htmlunit也用的是nekohtml),但感覺(jué) nekohtml的測(cè)試用例和文檔都比htmlparser都少,而且htmlparser基本上能夠滿足垂直搜索引擎頁(yè)面處理分析的需求,因此先研究一下htmlparser的使用,有空再研究nekohtml和mozilla html parser的使用。     html的功能還是官方說(shuō)得最為清楚, 引用    HTML Parser

2、is a Java library used to parse HTML in either a linear or nested fashion. Primarily used for transformation or extraction, it features filters, visitors, custom tags and easy to use JavaBeans. It is a fast, robust and well tested package.     The two fundamental use-cases that are ha

3、ndled by the parser are extraction and transformation (the syntheses use-case, where HTML pages are created from scratch, is better handled by other tools closer to the source of data). While prior versions concentrated on data extraction from web pages, Version 1.4 of the HTMLParser has substantial

4、 improvements in the area of transforming web pages, with simplified tag creation and editing, and verbatim toHtml() method output.    研究的重點(diǎn)還是extraction的使用,有空再研究transformation的使用。 1、htmlparser對(duì)html頁(yè)面處理的數(shù)據(jù)結(jié)構(gòu) color=blue 如圖所示,HtmlParser采用了經(jīng)典的Composite模式,通過(guò)RemarkNode、TextNode、TagNode、Abst

5、ractNode和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

6、    獲取節(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  

7、;   * 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。 &

8、#160;   * 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,Defini

9、tionListBullet,Div,FormTag,FrameSetTag,HeadingTag,         HeadTag,Html,LabelTag,LinkTag,ObjectTag,ParagraphTag,ScriptTag,SelectTag,Span,StyleTag,TableColumn,        TableHeader,TableRow,TableTag,TextareaTag,TitleTag    

10、 葉子節(jié)點(diǎn)TAG:         BaseHrefTag,DoctypeTag,FrameTag,ImageTag,InputTag,JspTag,MetaTag,ProcessingInstructionTag, 2、htmlparser對(duì)html頁(yè)面處理的算法 主要是如下幾種方式 Java代碼 1.     * 采用Visitor方式訪問(wèn)Html   2.   3. try    4.  &

11、#160;  Parser parser = new Parser();   5.     parser.setURL(”);   6.     parser.setEncoding(parser.getEncoding();   7.     NodeVisitor visitor = new NodeVisitor

12、()    8.         public void visitTag(Tag tag)    9.             logger.fatal(”testVisitorAll()  Tag name is :”   10. &#

13、160;                   + tag.getTagName() + ” n Class is :”   11.                

14、0;    + tag.getClass();   12.            13.   14.        15.   16.     parser.visitAllNodesWith(visitor);   17.  catch (Pars

15、erException e)    18.     e.printStackTrace();   19.   20.   21.     * 采用Filter方式訪問(wèn)html   22.   23. try    24.   25.     NodeFilter fil

16、ter = new NodeClassFilter(LinkTag.class);   26.     Parser parser = new Parser();   27.     parser.setURL(”);   28.     parser.setEncoding(parser.getEncoding();   29

17、.     NodeList list = parser.extractAllNodesThatMatch(filter);   30.     for (int i = 0; i < list.size(); i+)    31.         LinkTag 

18、;node = (LinkTag) list.elementAt(i);   32.         logger.fatal(”testLinkTag() Link is :” + node.extractLink();   33.        34.  catch (Exception e) 

19、   35.     e.printStackTrace();   36.   37.   38.     * 采用org.htmlparser.beans方式   39.   40. 另外htmlparser 還在org.htmlparser.beans中對(duì)一些常用的方法進(jìn)行了封裝,以簡(jiǎn)化操作,例如:   41.   42. Parse

20、r parser = new Parser();   43.   44. LinkBean linkBean = new LinkBean();   45. linkBean.setURL(”);   46. URL urls = linkBean.getLinks();   47.   48. for (int i = 0;&

21、#160;i < urls.length; i+)    49.     URL url = urlsi;   50.     logger.fatal(”testLinkBean() -url  is :” + url);   51.   52.   53.   

22、0; 54. 3、htmlparser關(guān)鍵包結(jié)構(gòu)說(shuō)明   55.   56.     htmlparser其實(shí)核心代碼并不多,好好研究一下其代碼,彌補(bǔ)文檔不足的問(wèn)題。同時(shí)htmlparser的代碼注釋和單元測(cè)試用例還是很齊全的,也有助于了解htmlparser的用法。   57.   58.   59. 3.1、org.htmlparser   60.   61.    

23、60;定義了htmlparser的一些基礎(chǔ)類(lèi)。其中最為重要的是Parser類(lèi)。   62.   63.     Parser是htmlparser的最核心的類(lèi),其構(gòu)造函數(shù)提供了如下:Parser.createParser (String html, String charset)、 Parser ()、Parser (Lexer lexer, ParserFeedback fb)、Parser (URLCo

24、nnection connection, ParserFeedback fb)、Parser (String resource, ParserFeedback feedback)、 Parser (String resource)   64.   65.   各構(gòu)造函數(shù)的具體用法及含義可以查看其代碼,很容易理解。   66.   67.   Parser常用的幾個(gè)方法: 

25、60; 68.   69.     *   elements獲取元素   70.   71.     Parser parser = new Parser (”);   72.     for (NodeIterator i = parser.elements 

26、;(); i.hasMoreElements (); )   73.       processMyNodes (i.nextNode ();   74.   75.     * parse (NodeFilter filter):通過(guò)NodeFilter方式獲取   76.     * 

27、visitAllNodesWith (NodeVisitor visitor):通過(guò)Nodevisitor方式   77.     * extractAllNodesThatMatch (NodeFilter filter):通過(guò)NodeFilter方式   78.   79. 3.2、org.htmlparser.beans   80.   81.     對(duì)Vis

28、itor和Filter的方法進(jìn)行了封裝,定義了針對(duì)一些常用html元素操作的bean,簡(jiǎn)化對(duì)常用元素的提取操作。   82.   83.     包括:FilterBean、HTMLLinkBean、HTMLTextBean、LinkBean、StringBean、BeanyBaby等。   84. 3.3、org.htmlparser.nodes   85.   86.     定義了基礎(chǔ)的node,包括:Abst

29、ractNode、RemarkNode、TagNode、TextNode等。   87. 3.4、org.htmlparser.tags   88.   89.     定義了htmlparser的各種tag。   90. 3.5、org.htmlparser.filters   91.   92.     定義了htmlparser所提供的各種filter,主要通過(guò)extractAllNodes

30、ThatMatch (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、

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

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

33、 101. 3.8、org.htmlparser.tests   102.   103.    對(duì)各種功能的單元測(cè)試用例,也可以作為htmlparser使用的樣例。   104.   105.     106. 4、htmlparser的使用樣例   107.   108.     109.   110. import .URL;  &#

34、160;111.   112. import junit.framework.TestCase;   113.   114. import org.apache.log4j.Logger;   115. import org.htmlparser.Node;   116. import org.htmlparser.NodeFilter;   117. import org.htmlparser.Parser;  &

35、#160;118. import org.htmlparser.Tag;   119. import org.htmlparser.beans.LinkBean;   120. import org.htmlparser.filters.NodeClassFilter;   121. import org.htmlparser.filters.OrFilter;   122. import org.htmlparser.filters.TagNameFilter;

36、  123. import org.htmlparser.tags.HeadTag;   124. import org.htmlparser.tags.ImageTag;   125. import org.htmlparser.tags.InputTag;   126. import org.htmlparser.tags.LinkTag;   127. import org.htmlparser.tags.OptionTag;  

37、 128. import org.htmlparser.tags.SelectTag;   129. import org.htmlparser.tags.TableColumn;   130. import org.htmlparser.tags.TableRow;   131. import org.htmlparser.tags.TableTag;   132. import org.htmlparser.tags.TitleTag;  &

38、#160;133. import org.htmlparser.util.NodeIterator;   134. import org.htmlparser.util.NodeList;   135. import org.htmlparser.util.ParserException;   136. import org.htmlparser.visitors.HtmlPage;   137. import org.htmlparser.visitors.Nod

39、eVisitor;   138. import org.htmlparser.visitors.ObjectFindingVisitor;   139.   140. public class ParserTestCase extends TestCase    141.   142.     private static final Logger logg

40、er = Logger.getLogger(ParserTestCase.class);   143.   144.     public ParserTestCase(String name)    145.         super(name);   146.        147.

41、     /*  148.      * 測(cè)試ObjectFindVisitor的用法  149.      */  150.     public void testImageVisitor()    151.         try&#

42、160;   152.             ImageTag imgLink;   153.             ObjectFindingVisitor visitor = new ObjectFindingVisitor(   154.

43、                    ImageTag.class);   155.             Parser parser = new Parser();   156.  &

44、#160;          parser.setURL(”);   157.             parser.setEncoding(parser.getEncoding();   158.            

45、0;parser.visitAllNodesWith(visitor);   159.             Node nodes = visitor.getTags();   160.             for (int i = 0;

46、60;i < nodes.length; i+)    161.                 imgLink = (ImageTag) nodesi;   162.              

47、;   logger.fatal(”testImageVisitor() ImageURL = “   163.                         + imgLink.getImageURL();   164.   

48、              logger.fatal(”testImageVisitor() ImageLocation = “   165.                       &

49、#160; + imgLink.extractImageLocn();   166.                 logger.fatal(”testImageVisitor() SRC = “   167.            &#

50、160;            + imgLink.getAttribute(”SRC”);   168.                169.            170.   

51、60;     catch (Exception e)    171.             e.printStackTrace();   172.            173.        1

52、74.     /*  175.      * 測(cè)試TagNameFilter用法  176.      */  177.     public void testNodeFilter()    178.         try 

53、   179.             NodeFilter filter = new TagNameFilter(”IMG”);   180.             Parser parser = new Parser();  

54、; 181.             parser.setURL(”);   182.             parser.setEncoding(parser.getEncoding();   183.         

55、60;   NodeList list = parser.extractAllNodesThatMatch(filter);   184.             for (int i = 0; i < list.size(); i+)    185.   

56、60;             logger.fatal(”testNodeFilter() ” + list.elementAt(i).toHtml();   186.                187.      

57、0;   catch (Exception e)    188.             e.printStackTrace();   189.            190.   191.       

58、60;192.     /*  193.      * 測(cè)試NodeClassFilter用法  194.      */  195.     public void testLinkTag()    196.         try

59、60;   197.   198.             NodeFilter filter = new NodeClassFilter(LinkTag.class);   199.             Parser parser =

60、 new Parser();   200.             parser.setURL(”);   201.             parser.setEncoding(parser.getEncoding();   202.    

61、60;        NodeList list = parser.extractAllNodesThatMatch(filter);   203.             for (int i = 0; i < list.size(); i+)  &#

62、160; 204.                 LinkTag node = (LinkTag) list.elementAt(i);   205.                 logger.fatal

63、(”testLinkTag() Link is :” + node.extractLink();   206.                207.          catch (Exception e)    208.   

64、          e.printStackTrace();   209.            210.   211.        212.     /*  213.      * 測(cè)試

65、<link href=” text=text/css rel=stylesheet />用法  214.      */  215.     public void testLinkCSS()    216.         try    217.  

66、60;218.             Parser parser = new Parser();   219.             parser   220.          

67、60;          .setInputHTML(”<head><title>Link Test</title>”   221.                          

68、   + “<link href=/test01/css.css text=text/css rel=stylesheet />”   222.                             +&#

69、160;“<link href=/test02/css.css text=text/css rel=stylesheet />”   223.                             + “</head>”&#

70、160;+ “<body>”);   224.             parser.setEncoding(parser.getEncoding();   225.             NodeList nodeList = null;   

71、226.   227.             for (NodeIterator e = parser.elements(); e.hasMoreNodes();)    228.                 No

72、de node = e.nextNode();   229.                 logger   230.                     

73、0;   .fatal(”testLinkCSS()” + node.getText()   231.                                 + node.getClass(

74、);   232.   233.                234.          catch (Exception e)    235.            

75、 e.printStackTrace();   236.            237.        238.     /*  239.      * 測(cè)試OrFilter的用法  240.      */  241.

76、     public void testOrFilter()    242.         NodeFilter inputFilter = new NodeClassFilter(InputTag.class);   243.         NodeFilter sele

77、ctFilter = new NodeClassFilter(SelectTag.class);   244.         Parser myParser;   245.         NodeList nodeList = null;   246.   247.  

78、60;      try    248.             Parser parser = new Parser();   249.             parser   250.

79、                     .setInputHTML(”<head><title>OrFilter Test</title>”   251.               

80、0;             + “<link href=/test01/css.css text=text/css rel=stylesheet />”   252.                   &

81、#160;         + “<link href=/test02/css.css text=text/css rel=stylesheet />”   253.                      

82、0;      + “</head>”   254.                             + “<body>”   255.   

83、60;                         + “<input type=text value=text1 name=text1/>”   256.          

84、0;                  + “<input type=text value=text2 name=text2/>”   257.                  

85、;           + “<select><option id=1>1</option><option id=2>2</option><option id=3></option></select>”   258.          

86、0;                  + “<a href=></a>”   259.                       &

87、#160;     + “</body>”);   260.   261.             parser.setEncoding(parser.getEncoding();   262.             OrFi

88、lter lastFilter = new OrFilter();   263.             lastFilter.setPredicates(new NodeFilter  selectFilter,   264.            

89、0;        inputFilter );   265.             nodeList = parser.parse(lastFilter);   266.             for&#

90、160;(int i = 0; i <= nodeList.size(); i+)    267.                 if (nodeList.elementAt(i) instanceof InputTag)    268.   

91、0;                 InputTag tag = (InputTag) nodeList.elementAt(i);   269.                   &#

92、160; logger.fatal(”O(jiān)rFilter tag name is :” + tag.getTagName()   270.                             + ” ,tag

93、 value is:” + tag.getAttribute(”value”);   271.                    272.                 if (nod

94、eList.elementAt(i) instanceof SelectTag)    273.                     SelectTag tag = (SelectTag) nodeList.elementAt(i);   274.    

95、                 NodeList list = tag.getChildren();   275.   276.                    

96、 for (int j = 0; j < list.size(); j+)    277.                         OptionTag option = (OptionTag)&#

97、160;list.elementAt(j);   278.                         logger   279.                &#

98、160;                .fatal(”O(jiān)rFilter Option”   280.                          

99、60;              + option.getOptionText();   281.                        282.   283.  

100、0;                 284.                285.   286.          catch (ParserException e)

101、    287.             e.printStackTrace();   288.            289.        290.     /*  291.    &#

102、160; * 測(cè)試對(duì)<table><tr><td></td></tr></table>的解析  292.      */  293.     public void testTable()    294.         Parser myPars

103、er;   295.         NodeList nodeList = null;   296.         myParser = Parser.createParser(”<body> ” + “<table id=table1 >”   29

104、7.                 + “<tr><td>1-11</td><td>1-12</td><td>1-13</td>”   298.                

105、; + “<tr><td>1-21</td><td>1-22</td><td>1-23</td>”   299.                 + “<tr><td>1-31</td><td>1-32</td><td>1-33<

106、;/td></table>”   300.                 + “<table id=table2 >”   301.                 + 

107、;“<tr><td>2-11</td><td>2-12</td><td>2-13</td>”   302.                 + “<tr><td>2-21</td><td>2-22</td><td>2-23</td>” 

108、60; 303.                 + “<tr><td>2-31</td><td>2-32</td><td>2-33</td></table>”   304.           

109、0;     + “</body>”, “GBK”);   305.         NodeFilter tableFilter = new NodeClassFilter(TableTag.class);   306.         OrFilter lastF

110、ilter = new OrFilter();   307.         lastFilter.setPredicates(new NodeFilter  tableFilter );   308.         try    309.     

111、0;       nodeList = myParser.parse(lastFilter);   310.             for (int i = 0; i <= nodeList.size(); i+)    311.  

112、0;              if (nodeList.elementAt(i) instanceof TableTag)    312.                     TableTag&

113、#160;tag = (TableTag) nodeList.elementAt(i);   313.                     TableRow rows = tag.getRows();   314.   315.     

114、;                for (int j = 0; j < rows.length; j+)    316.                 

115、0;       TableRow tr = (TableRow) rowsj;   317.                         TableColumn td = tr.getColum

116、ns();   318.                         for (int k = 0; k < td.length; k+)    319.      &#

117、160;                      logger.fatal(”<td>” + tdk.toPlainTextString();   320.               

118、             321.   322.                        323.   324.         &#

119、160;          325.                326.   327.          catch (ParserException e)    328.   

120、0;         e.printStackTrace();   329.            330.        331.     /*  332.      * 測(cè)試NodeVisitor的用法,遍歷所有節(jié)點(diǎn)

121、  333.      */  334.     public void testVisitorAll()    335.         try    336.             Parser

122、 parser = new Parser();   337.             parser.setURL(”);   338.             parser.setEncoding(parser.getEncoding();   339. &#

123、160;           NodeVisitor visitor = new NodeVisitor()    340.                 public void visitTag(Tag tag) 

124、  341.                     logger.fatal(”testVisitorAll()  Tag name is :”   342.             &#

125、160;               + tag.getTagName() + ” n Class is :”   343.                    

126、60;        + tag.getClass();   344.                    345.   346.               

127、; 347.   348.             parser.visitAllNodesWith(visitor);   349.          catch (ParserException e)    350.      

128、0;      e.printStackTrace();   351.            352.        353.     /*  354.      * 測(cè)試對(duì)指定Tag的NodeVisitor的用法  355.  

129、    */  356.     public void testTagVisitor()    357.         try    358.   359.             Parser&

130、#160;parser = new Parser(   360.                     “<head><title>dddd</title>”   361.           

131、;                  + “<link href=/test01/css.css text=text/css rel=stylesheet />”   362.              &#

132、160;              + “<link href=/test02/css.css text=text/css rel=stylesheet />”   363.                  

133、;           + “</head>” + “<body>”   364.                             + “<a href=></a>”   365.      

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論