jkshangss 2012-08-06
Htmlparser简介
htmlparser是一个纯的java写的html解析的库,它不依赖于其它的java库文件,主要用于改造或
提取html。它能超高速解析html,而且不会出错。现在htmlparser最新版本为2.0。
基础运用
目标页面代码
<ul class="list_ul"> <li class="title_li">1 <a href="http://f.wanfangdata.com.cn/download/Periodical_zhfsbx98200105004.aspx" style="" title="全文" target="_blank" class="pdf_img"></a> <a href="http://d.wanfangdata.com.cn/Periodical_zhfsbx98200105004.aspx" style="display:none" title="文摘" target="_blank" class="abs_img"></a> [url=http://d.wanfangdata.com.cn/Periodical_zhfsbx98200105004.aspx]抗环瓜氨酸肽抗体检测在<font color="red">类风湿</font>关节炎中的意义[/url] <span>(<t>被引用</t> 182 <t>次</t>)</span></li> <li class="greencolor">[<t>期刊论文</t>] [url=http://c.wanfangdata.com.cn/Periodical-zhfsbx98.aspx]《中华风湿病学杂志》[/url] <span> <span title="被中信所《中国科技期刊引证报告》收录">ISTIC</span> <span title="被北京大学《中文核心期刊要目总览》收录">PKU</span> </span>-[url=http://c.wanfangdata.com.cn/periodical/zhfsbx98/2001-5.aspx]2001年5期[/url]<a target="_blank" href="http://social.wanfangdata.com.cn/Locate.ashx?ArticleId=zhfsbx98200105004&Name=%e6%9b%be%e5%b0%8f%e5%b3%b0">曾小峰</a><a target="_blank" href="http://social.wanfangdata.com.cn/Locate.ashx?ArticleId=zhfsbx98200105004&Name=%e8%89%be%e8%84%89%e5%85%b4">艾脉兴</a><a target="_blank" href="http://social.wanfangdata.com.cn/Locate.ashx?ArticleId=zhfsbx98200105004&Name=%e7%94%98%e6%99%93%e4%b8%b9">甘晓丹</a><a target="_blank" href="http://social.wanfangdata.com.cn/Locate.ashx?ArticleId=zhfsbx98200105004&Name=%e5%8f%b2%e8%89%b3%e8%90%8d">史艳萍</a><a target="_blank" href="http://social.wanfangdata.com.cn/Locate.ashx?ArticleId=zhfsbx98200105004&Name=%e5%ae%8b%e7%90%b4%e8%8a%b3">宋琴芳</a><a target="_blank" href="http://social.wanfangdata.com.cn/Locate.ashx?ArticleId=zhfsbx98200105004&Name=%e5%94%90%e7%a6%8f%e6%9e%97">唐福林</a></li> </ul>
目标解析上述页面代码,获取标签
[url=http://d.wanfangdata.com.cn/Periodical_zhfsbx98200105004.aspx]抗环瓜氨酸肽抗体检测在<font color="red">类风湿</font>关节炎中的意义[/url]
中的内容,通过htmlparser实现如下:
package com.nit.htmlparser.test; import java.io.File; import org.htmlparser.Node; import org.htmlparser.NodeFilter; import org.htmlparser.Parser; import org.htmlparser.filters.AndFilter; import org.htmlparser.filters.HasAttributeFilter; import org.htmlparser.filters.TagNameFilter; import org.htmlparser.util.NodeList; public class Htmlparser { public static void main(String[] args) { File file = new File("E:\\JavaEE Work\\HtmlparserTest\\source.txt");//获取上述html代码 try { Parser parser = new Parser(file.getAbsolutePath()); parser.setEncoding("GBK"); //设置编码格式 NodeFilter filter1 = new TagNameFilter("li"); NodeFilter filter2 = new HasAttributeFilter("class","title_li"); NodeFilter filter = new AndFilter(filter1,filter2); //设置页面过滤条件 NodeList nodeList = parser.extractAllNodesThatMatch(filter); //根据过滤条件解析页面 Node node = nodeList.elementAt(0); String html = node.getChildren().toHtml(); //将抽取出来的信息转化为html再次解析 filter1 = new HasAttributeFilter("target", "_blank"); parser = Parser.createParser(html, "GBK"); nodeList = parser.extractAllNodesThatMatch(filter1); System.out.println(nodeList.elementAt(2).getChildren().asString()); filter2 = new TagNameFilter("span"); parser = Parser.createParser(html, "GBK"); nodeList = parser.extractAllNodesThatMatch(filter2); System.out.println(nodeList.elementAt(0).getChildren().asString()); } catch (Throwable e) { e.printStackTrace(); } } }
代码解析:htmlparser的使用,首先在项目中导入htmlparser.jar包,然后创建Parser类,可用通过文件导入,String类型数据创建(Parserparser=newParser(file.getAbsolutePath());或parser=Parser.createParser(html,"GBK");)。
然后制定过滤规则。
标签过滤的方式有三种:
NodeFilterfilter1=newTagNameFilter("li");通过标签匹配需要需求的内容,本代码的意思就是匹配html标签为<li>的内容;
NodeFilterfilter2=newHasAttributeFilter("class","title_li");通过标签属性来匹配需求内容,本代码的意思是匹配html标签属性为class=title_li的内容;
NodeFilterfilter=newAndFilter(filter1,filter2);匹配符合filter1和filter2两个过滤要求的内容,可以通过这三种方式随意组合来精确定位目标文本内容,这三句代码组合过滤条件为匹配<liclass="title_li">的文本内容。
当发现获取的文本还不是十分符合需要获取内容的要求时,可以将文本还原为html代码后,再次进行匹配。
当通过过滤器获取到nodeList后,通过htmlparser接口能够获取匹配出来的html的父标签,子标签,兄弟标签及其自身文本等内容。附上内容获取的接口:
HTMLParser将解析过的信息留存为一个树的结构。Node是信息留存的数据类型基础。
请看Node的界说:
publicinterfaceNodeextendsCloneable;
Node中包括的要领有几类:
对付树型结构进行遍历的函数,这些函数最轻易理解:
NodegetParent():取得父节点
NodeListgetChildren():取得子节点的列表
NodegetFirstChild():取得第一个子节点
NodegetLastChild():取得最后一个子节点
NodegetPreviousSibling():取得前一个兄弟(欠好意思,英文是兄弟姐妹,直译太麻烦并且不相符习惯,抱歉女同胞了)
NodegetNextSibling():取得下一个兄弟节点
取得Node内容的函数:
StringgetText():取得文本
StringtoPlainTextString():取得纯文本信息。
StringtoHtml():取得HTML信息(原始HTML)
StringtoHtml(booleanverbatim):取得HTML信息(原始HTML)
StringtoString():取得字符串信息(原始HTML)
PagegetPage():取得这个Node对应的Page东西
intgetStartPosition():取得这个Node在HTML页面中的起始位置
intgetEndPosition():取得这个Node在HTML页面中的结束位置
用于Filter过滤的函数:
voidcollectInto(NodeListlist,NodeFilterfilter):基于filter的条件对付这个节点进行过滤,相符条件的节点放到list中。
用于Visitor遍历的函数:
voidaccept(NodeVisitorvisitor):对这个Node应用visitor
用于修改内容的函数,这类用得比较少:
voidsetPage(Pagepage):设置这个Node对应的Page东西
voidsetText(Stringtext):设置文本
voidsetChildren(NodeListchildren):设置子节点列表
其他函数:
voiddoSemanticAction():执行这个Node对应的操纵(只有少数Tag有对应的操纵)
Objectclone():接口Clone的抽象函数。