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

下載本文檔

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

文檔簡介

1、.需要做一個垂直搜索引擎,比較了nekohtml和htmlparser 的功能,盡管nekohtml在容錯性、性能等方面的口碑好像比htmlparser好(htmlunit也用的是nekohtml),但感覺 nekohtml的測試用例和文檔都比htmlparser都少,而且htmlparser基本上能夠滿足垂直搜索引擎頁面處理分析的需求,因此先研究一下htmlparser的使用,有空再研究nekohtml和mozilla html parser的使用。     html的功能還是官方說得最為清楚, 引用    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對html頁面處理的數(shù)據(jù)結(jié)構(gòu) color=blue 如圖所示,HtmlParser采用了經(jīng)典的Composite模式,通過RemarkNode、TextNode、TagNode、Abst

5、ractNode和Tag來描述HTML頁面各元素。     * org.htmlparser.Node:     Node接口定義了進(jìn)行樹形結(jié)構(gòu)節(jié)點(diǎn)操作的各種典型操作方法,包括:     節(jié)點(diǎn)到html文本、text文本的方法:toPlainTextString、toHtml    典型樹形結(jié)構(gòu)遍歷的方法:getParent、getChildren、getFirstChild、getLastChild、getPreviousSibling、getNextSibling、getText

6、    獲取節(jié)點(diǎn)對應(yīng)的樹形結(jié)構(gòu)結(jié)構(gòu)的頂級節(jié)點(diǎn)Page對象方法: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樹形結(jié)構(gòu)抽象基類,實(shí)現(xiàn)了Node接口。     在htmlparser中,Node分成三類:     RemarkNode:代表Html中的注釋     TagNode:標(biāo)簽節(jié)點(diǎn)。     TextNode:文本節(jié)點(diǎn)     這三類節(jié)點(diǎn)都繼承AbstractNode。 &

8、#160;   * org.htmlparser.nodes.TagNode:     TagNode包含了對HTML處理的核心的各個類,是所有TAG的基類,其中有分為包含其他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對html頁面處理的算法 主要是如下幾種方式 Java代碼 1.     * 采用Visitor方式訪問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方式訪問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中對一些常用的方法進(jì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)說明   55.   56.     htmlparser其實(shí)核心代碼并不多,好好研究一下其代碼,彌補(bǔ)文檔不足的問題。同時(shí)htmlparser的代碼注釋和單元測試用例還是很齊全的,也有助于了解htmlparser的用法。   57.   58.   59. 3.1、org.htmlparser   60.   61.    

23、60;定義了htmlparser的一些基礎(chǔ)類。其中最為重要的是Parser類。   62.   63.     Parser是htmlparser的最核心的類,其構(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常用的幾個方法: 

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):通過NodeFilter方式獲取   76.     * 

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

28、itor和Filter的方法進(jìn)行了封裝,定義了針對一些常用html元素操作的bean,簡化對常用元素的提取操作。   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,主要通過extractAllNodes

30、ThatMatch (NodeFilter filter)來對html頁面指定類型的元素進(jìn)行過濾,包括: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,主要通過visitAllNodesWith (NodeVisitor visitor)來對html頁面元素進(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,這幾個類也可以作為htmlparser使用樣例。  

33、 101. 3.8、org.htmlparser.tests   102.   103.    對各種功能的單元測試用例,也可以作為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.      * 測試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.      * 測試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.      * 測試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.      * 測試

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

評論

0/150

提交評論