java htmlparser 使用教程_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類創(chuàng)建一個解釋器
(2)創(chuàng)建Filter或者Visitor
(3)使用parser根據(jù)filter或者visitor來取得所有符合條件的節(jié)點
(4)對節(jié)點內(nèi)容進行處理
3、使用Parser的構(gòu)造函數(shù)創(chuàng)建解釋器
對于大多數(shù)使用者來說,使用最多的是通過一個URLConnection或者一個保存有網(wǎng)頁內(nèi)容的字符串來初始化Parser,或者使用靜態(tài)函數(shù)來生成一個Parser對象。ParserFeedback的代碼很簡單,是針對調(diào)試和跟蹤分析過程的,一般不需要改變。而使用Lexer則是一個相對比較高級的話題,放到以后再討論吧。
這里比較有趣的一點是,如果需要設置頁面的編碼方式的話,不使用Lexer就只有靜態(tài)函數(shù)一個方法了。對于大多數(shù)中文頁面來說,好像這是應該用得比較多的一個方法。
4、HtmlPaser使用Node對象保存各節(jié)點信息
(1)訪問各個節(jié)點的方法
Node?getParent?():取得父節(jié)點
NodeList?getChildren?():取得子節(jié)點的列表
Node?getFirstChild?():取得第一個子節(jié)點
Node?getLastChild?():取得最后一個子節(jié)點
Node?getPreviousSibling?():取得前一個兄弟(不好意思,英文是兄弟姐妹,直譯太麻煩而且不符合習慣,對不起女同胞了)
Node?getNextSibling?():取得下一個兄弟節(jié)點
(2)取得Node內(nèi)容的函數(shù)
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頁面中的結(jié)束位置
5、使用Filter訪問Node節(jié)點及其內(nèi)容
(1)Filter的種類
顧名思義,Filter就是對于結(jié)果進行過濾,取得需要的內(nèi)容。
所有的Filter均實現(xiàn)了NodeFilter接口,此接口只有一個方法Boolean accept(Node node),用于確定某個節(jié)點是否屬于此Filter過濾的范圍。
HTMLParser在org.htmlparser.filters包之內(nèi)一共定義了16個不同的Filter,也可以分為幾類。
TagNameFilterHasAttributeFilter
HasChildFilter
HasParentFilter
HasSiblingFilter
IsEqualFilter
AndFilterNotFilter
OrFilter
XorFilter
NodeClassFilterStringFilter
LinkStringFilter
LinkRegexFilter
RegexFilter
CssSelectorNodeFilter
除此以外,可以自定義一些Filter,用于完成特殊需求的過濾。
(2)Filter的使用示例
以下示例用于提取HTML文件中的鏈接
packageorg.ljh.search.html;
importjava.util.HashSet;
importjava.util.Set;
importorg.htmlparser.Node;
importorg.htmlparser.NodeFilter;
importorg.htmlparser.Parser;
importorg.htmlparser.filters.NodeClassFilter;
importorg.htmlparser.filters.OrFilter;
importorg.htmlparser.tags.LinkTag;
importorg.htmlparser.util.NodeList;
importorg.htmlparser.util.ParserException;
//本類創(chuàng)建用于HTML文件解釋工具
publicclassHtmlParserTool?{
//?本方法用于提取某個html文檔中內(nèi)嵌的鏈接
publicstaticSet?extractLinks(String?url,?LinkFilter?filter)?{
Set?links?=?newHashSet();
try{
//?1、構(gòu)造一個Parser,并設置相關的屬性
Parser?parser?=?newParser(url);
parser.setEncoding("gb2312");
//?2.1、自定義一個Filter,用于過濾標簽,然后取得標簽中的src屬性值
NodeFilter?frameNodeFilter?=?newNodeFilter()?{
@Override
publicbooleanaccept(Node?node)?{
if(node.getText().startsWith("frame?src="))?{
returntrue;
}?else{
returnfalse;
}
}
};
//2.2、創(chuàng)建第二個Filter,過濾標簽
NodeFilter?aNodeFilter?=?newNodeClassFilter(LinkTag.class);
//2.3、凈土上述2個Filter形成一個組合邏輯Filter。
OrFilter?linkFilter?=?newOrFilter(frameNodeFilter,?aNodeFilter);
//3、使用parser根據(jù)filter來取得所有符合條件的節(jié)點
NodeList?nodeList?=?parser.extractAllNodesThatMatch(linkFilter);
//4、對取得的Node進行處理
for(inti?=0;?i
Node?node?=?nodeList.elementAt(i);
String?linkURL?=?"";
//如果鏈接類型為
if(nodeinstanceofLinkTag){
LinkTag?link?=?(LinkTag)node;
linkURL=?link.getLink();
}else{
//如果類型為
String?nodeText?=?node.getText();
intbeginPosition?=?nodeText.indexOf("src=");
nodeText?=?nodeText.substring(beginPosition);
intendPosition?=?nodeText.indexOf("?");
if(endPosition?==?-1){
endPosition?=?nodeText.indexOf(">");
}
linkURL?=?nodeText.substring(5,?endPosition?-1);
}
//判斷是否屬于本次搜索范圍的url
if(filter.accept(linkURL)){
links.add(linkURL);
}
}
}?catch(ParserException?e)?{
e.printStackTrace();
}
returnlinks;
}
}
程序中的一些說明:
(1)通過Node#getText()取得節(jié)點的String。
(2)node instanceof TagLink,即節(jié)點,其它還有很多的類似節(jié)點,如tableTag等,基本上每個常見的html標簽均會對應一個tag。官方文檔說明如下:
The nodes package has the concrete node implementations.
The tags package contains specific tags.
因此可以通過此方法直接判斷一個節(jié)點是否某個標簽內(nèi)容。
其中用到的LinkFilter接口定義如下:
packageorg.ljh.search.html;
//本接口所定義的過濾器,用于判斷url是否屬于本次搜索范圍。
publicinterfaceLinkFilter?{
publicbooleanaccept(String?url);
}
測試程序如下:
packageorg.ljh.search.html;
importjava.util.Iterator;
importjava.util.Set;
importorg.junit.Test;
publicclassHtmlParserToolTest?{
@Test
publicvoidtestExtractLinks()?{
String?url?=?"http://www.baidu.com";
LinkFilter?linkFilter?=?newLinkFilter(){
@Override
publicbooleanaccept(String?url)?{
if(url.contains("baidu")){
returntrue;
}else{
returnfalse;
}
}
};
Set?urlSet?=?HtmlParserTool.extractLinks(url,?linkFilter);
Iterator?it?=?urlSet.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}
輸出結(jié)果如下:
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
總結(jié)
以上是生活随笔為你收集整理的java htmlparser 使用教程_HtmlParser基础教程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: FFT 入门
- 下一篇: UPS开始尝试“货车+无人机”的投递方式