版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度農(nóng)業(yè)科技園區(qū)設(shè)施租賃協(xié)議4篇
- 啟迪未來(lái)點(diǎn)亮夢(mèng)想
- 2025版收入證明模板制作與市場(chǎng)推廣合作合同3篇
- 2025年全球及中國(guó)氣體激光清洗設(shè)備行業(yè)頭部企業(yè)市場(chǎng)占有率及排名調(diào)研報(bào)告
- 2025年全球及中國(guó)住宅用灌溉噴水閥行業(yè)頭部企業(yè)市場(chǎng)占有率及排名調(diào)研報(bào)告
- 2025-2030全球?qū)櫸锔闻K功能補(bǔ)充劑行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 2025-2030全球印章套件行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 2025-2030全球光伏發(fā)電箱變行業(yè)調(diào)研及趨勢(shì)分析報(bào)告
- 施工承包合同標(biāo)準(zhǔn)模板
- 2025版?zhèn)€人購(gòu)房貸款還款順序合同模板3篇
- 小學(xué)六年級(jí)數(shù)學(xué)上冊(cè)《簡(jiǎn)便計(jì)算》練習(xí)題(310題-附答案)
- 2023-2024學(xué)年度人教版一年級(jí)語(yǔ)文上冊(cè)寒假作業(yè)
- 培訓(xùn)如何上好一堂課
- 高教版2023年中職教科書(shū)《語(yǔ)文》(基礎(chǔ)模塊)下冊(cè)教案全冊(cè)
- 2024醫(yī)療銷(xiāo)售年度計(jì)劃
- 稅務(wù)局個(gè)人所得稅綜合所得匯算清繳
- 人教版語(yǔ)文1-6年級(jí)古詩(shī)詞
- 上學(xué)期高二期末語(yǔ)文試卷(含答案)
- 軟件運(yùn)維考核指標(biāo)
- 空氣動(dòng)力學(xué)仿真技術(shù):格子玻爾茲曼方法(LBM)簡(jiǎn)介
- 比較思想政治教育學(xué)
評(píng)論
0/150
提交評(píng)論