版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024股權(quán)抵押借款合同范本格式
- 2024商品買賣合同范本
- 2024年度甲方聘請乙方進(jìn)行市場推廣服務(wù)的合同
- 工廠用工合同協(xié)議書(2024年)
- 2024年建筑勞務(wù)分包主體結(jié)構(gòu)合同
- 個人質(zhì)押擔(dān)保借款合同模板
- 2024年度金融服務(wù)與投資咨詢合同
- 標(biāo)準(zhǔn)版工程居間合同格式
- 合法勞務(wù)施工協(xié)議書樣式
- 精美施工合同模板
- 淮陰工學(xué)院《產(chǎn)品形態(tài)設(shè)計(jì)》2021-2022學(xué)年第一學(xué)期期末試卷
- 2024年長沙市事業(yè)單位招聘計(jì)算機(jī)崗位專業(yè)知識試題
- 咨詢咨詢合同三篇
- 2024年中國心力衰竭診斷和治療指南2024版
- 師范大學(xué)學(xué)術(shù)規(guī)范測試
- 福建師范大學(xué)《數(shù)字?jǐn)z像》2023-2024學(xué)年第一學(xué)期期末試卷
- 期末模擬練習(xí)(試題)-2024-2025學(xué)年蘇教版二年級上冊數(shù)學(xué)
- 2023阿里云ACA大數(shù)據(jù)復(fù)習(xí)題題庫及答案
- 基于PLC的物料分揀系統(tǒng)設(shè)計(jì)
- 國開(內(nèi)蒙古)2024年《創(chuàng)新創(chuàng)業(yè)教育基礎(chǔ)》形考任務(wù)1-3終考任務(wù)答案
- 文旅深度融合績效評估與反饋機(jī)制
評論
0/150
提交評論