HtmlParser基础教程
1、相關資料
官方文檔:http://htmlparser.sourceforge.net/samples.html
API:http://htmlparser.sourceforge.net/javadoc/index.html
其它HTML 解釋器:jsoup等。由于HtmlParser自2006年以后就再沒更新,目前很多人推薦使用jsoup代替它。
2、使用HtmlPaser的關鍵步驟
(1)通過Parser類創建一個解釋器
(2)創建Filter或者Visitor
(3)使用parser根據filter或者visitor來取得所有符合條件的節點
(4)對節點內容進行處理
3、使用Parser的構造函數創建解釋器
| Parser()? ??????????Zero argument constructor. |
| Parser(Lexer?lexer)? ??????????Construct a parser using the provided lexer. |
| Parser(Lexer?lexer,?ParserFeedback?fb)? ??????????Construct a parser using the provided lexer and feedback object. |
| Parser(String?resource)? ??????????Creates a Parser object with the location of the resource (URL or file). |
| Parser(String?resource,?ParserFeedback?feedback)? ??????????Creates a Parser object with the location of the resource (URL or file) You would typically create a DefaultHTMLParserFeedback object and pass it in. |
| Parser(URLConnection?connection)? ??????????Construct a parser using the provided URLConnection. |
| Parser(URLConnection?connection,?ParserFeedback?fb)? ??????????Constructor for custom HTTP access. |
? ? ? ? 這里比較有趣的一點是,如果需要設置頁面的編碼方式的話,不使用Lexer就只有靜態函數一個方法了。對于大多數中文頁面來說,好像這是應該用得比較多的一個方法。
4、HtmlPaser使用Node對象保存各節點信息
(1)訪問各個節點的方法
Node?getParent?():取得父節點
NodeList?getChildren?():取得子節點的列表
Node?getFirstChild?():取得第一個子節點
Node?getLastChild?():取得最后一個子節點
Node?getPreviousSibling?():取得前一個兄弟(不好意思,英文是兄弟姐妹,直譯太麻煩而且不符合習慣,對不起女同胞了)
Node?getNextSibling?():取得下一個兄弟節點
(2)取得Node內容的函數
String?getText?():取得文本
String?toPlainTextString():取得純文本信息。
String?toHtml?()?:取得HTML信息(原始HTML)
String?toHtml?(boolean verbatim):取得HTML信息(原始HTML)
String?toString?():取得字符串信息(原始HTML)
Page?getPage?():取得這個Node對應的Page對象
int?getStartPosition?():取得這個Node在HTML頁面中的起始位置
int?getEndPosition?():取得這個Node在HTML頁面中的結束位置
5、使用Filter訪問Node節點及其內容
(1)Filter的種類
顧名思義,Filter就是對于結果進行過濾,取得需要的內容。
所有的Filter均實現了NodeFilter接口,此接口只有一個方法Boolean accept(Node node),用于確定某個節點是否屬于此Filter過濾的范圍。
HTMLParser在org.htmlparser.filters包之內一共定義了16個不同的Filter,也可以分為幾類。
判斷類Filter:
TagNameFilter
HasAttributeFilter
HasChildFilter
HasParentFilter
HasSiblingFilter
IsEqualFilter
邏輯運算Filter:
AndFilter
NotFilter
OrFilter
XorFilter
其他Filter:
NodeClassFilter
StringFilter
LinkStringFilter
LinkRegexFilter
RegexFilter
CssSelectorNodeFilter
除此以外,可以自定義一些Filter,用于完成特殊需求的過濾。
(2)Filter的使用示例
以下示例用于提取HTML文件中的鏈接
[java]?view plaincopy
程序中的一些說明:
(1)通過Node#getText()取得節點的String。
(2)node instanceof TagLink,即<a/>節點,其它還有很多的類似節點,如tableTag等,基本上每個常見的html標簽均會對應一個tag。官方文檔說明如下:
| org.htmlparser.nodes | The nodes package has the concrete node implementations. |
| org.htmlparser.tags | The tags package contains specific tags. |
其中用到的LinkFilter接口定義如下:
[java]?view plaincopy
測試程序如下:
[java]?view plaincopy
http://www.hao123.com
http://www.baidu.com/
http://www.baidu.com/duty/
http://v.baidu.com/v?ct=301989888&rn=20&pn=0&db=0&s=25&word=
http://music.baidu.com
http://ir.baidu.com
http://www.baidu.com/gaoji/preferences.html
http://news.baidu.com
http://map.baidu.com
http://music.baidu.com/search?fr=ps&key=
http://image.baidu.com
http://zhidao.baidu.com
http://image.baidu.com/i?tn=baiduimage&ct=201326592&lm=-1&cl=2&nc=1&word=
http://www.baidu.com/more/
http://shouji.baidu.com/baidusearch/mobisearch.html?ref=pcjg&from=1000139w
http://wenku.baidu.com
http://news.baidu.com/ns?cl=2&rn=20&tn=news&word=
https://passport.baidu.com/v2/?login&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2F
http://www.baidu.com/cache/sethelp/index.html
http://zhidao.baidu.com/q?ct=17&pn=0&tn=ikaslist&rn=10&word=&fr=wwwt
http://tieba.baidu.com/f?kw=&fr=wwwt
http://home.baidu.com
https://passport.baidu.com/v2/?reg®Type=1&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2F
http://v.baidu.com
http://e.baidu.com/?refer=888
;
http://tieba.baidu.com
http://baike.baidu.com
http://wenku.baidu.com/search?word=&lm=0&od=0
http://top.baidu.com
http://map.baidu.com/m?word=&fr=ps01000
總結
以上是生活随笔為你收集整理的HtmlParser基础教程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【搜索引擎Jediael开发4】V0.0
- 下一篇: 【搜索引擎基础知识3】搜索引擎相关开源项