HTMLParser的两种使用方法
因为论文的关系,要 用到HTMLParser这个项目(使用的HTMLParser版本是1.6)
一,数据组织分析:
HtmlParser主要靠Node、AbstractNode和Tag来表达Html,因为Remark和Text相对简单, 此处就将其忽略了。
Node分成三类:
二,Visitor方式访问Html:
1,整体解析过程
2,Visit过程
3,获取节点的过程:逐步遍历Html,分析出Node。此部分较为复杂,且对于我们应用来说无需很多 了解,暂跳过。
4,节点访问
节点访问采用Visitor模式,Node的accept方法和具体Visitor的visit方法是 关键。
首先三类Node来accept的方式各不相同:
系统为我们实现了下面我要介绍的8种Visitor,实际上可以看作是系统给我们演示了如何做各种各样 的Visitor来访问Html,因为实际上我们要真正来用HtmlParser的话,还需要特定的Visitor,而通过简单的这 些系统提供的Visitor组合是难以做成什么事情的。
三,系统Visitor功能简介:
四,Filter
如果说visitor是遍历提取信息,当然这个信息可以包括某些节点或者从节点分析出来的更有效的信息,这都取决 于我们的Visitor做成什么样子,那么Filter则目标很明确,就是用来提取节点的。所以说要想用HtmlParser,首先要熟悉上面讲到的数据 组织。
系统定义了17种具体的Filter,包括依据节点父子关系的Filter,连接Filter组合的 Filter,依据网页内容匹配情况的filter,等等。我们也可以implement Filter来做自己的Filter来提取节点。
Filter的调用是同Visitor独立的,因为也无需先filter出一些NodeList,再用 Visitor来访问。调用Filter的方法是:
NodeList nodeList = myParser.parse(someFilter);
解析之后,我们可以采用:
Node[] nodes = nodeList.toNodeArray();
来获取节点数组,也可以直接访问:
Node node = nodeList.elementAt(i)来获取Node。
另外,在Filter后得到NodeList以后,我们仍然可以使用NodeList的 extractAllNodesThatMatch(someFilter)来进一步过滤,同时又可以用NodeList的 isitAllNodesWith(someVisitor)来做进一步的访问。
这样,我们可以看到HtmlParser为我们提供了非常方便的Html解析方式,针对不同的应用可以采用 visitor来遍历Html节点提取数据,也可以用Filter来过滤节点,提取出我们所关注的节点,再对节点进行处理。通过这样的组合,一定能够找出 我们所需要的信息。
我的代码
package
com.eric.Html.htmlparser;
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.HasChildFilter; import org.htmlparser.filters.TagNameFilter; import org.htmlparser.util.NodeList; import org.htmlparser.util.ParserException; import org.htmlparser.visitors.TextExtractingVisitor; /** */ /** * @author 作者 Eric yang E-mail:yjboy1982@126.com * @version 创建时间:2007-7-16 下午02:49:55 * 类说明 */ public class AstroExtractorTest ... { /** */ /** * @param args * @throws ParserException */ public static void main(String[] args) throws ParserException ... { // TODO Auto-generated method stub String title ; String constellation ; String body ; String summary ; Parser parser = new Parser( " http://astro.sina.com.cn/sagittarius.html " ); parser.setEncoding( " GB2312 " ) ; NodeFilter filter_constellation_summart = new AndFilter(( new TagNameFilter( " td " )),( new HasChildFilter( new TagNameFilter( " b " )))) ; NodeFilter filter_title = new AndFilter( new TagNameFilter( " font " ), new HasAttributeFilter( " class " , " f1491 " )) ; NodeFilter filter_body = new AndFilter( new TagNameFilter( " td " ), new HasAttributeFilter( " width " , " 30% " )) ; NodeList nodelist = parser.parse(filter_constellation_summart) ; Node node_constellation = nodelist.elementAt( 0 ) ; constellation = node_constellation.getFirstChild().getNextSibling().toHtml() ; Node node_summary = nodelist.elementAt( 1 ) ; NodeList summary_nodelist = node_summary.getChildren() ; summary = summary_nodelist.elementAt( 3 ).toHtml() + summary_nodelist.elementAt( 5 ).toHtml() ; parser.reset() ; nodelist = parser.parse(filter_title) ; Node node_title = nodelist.elementAt( 0 ) ; title = node_title.getNextSibling().getNextSibling().toHtml() ; // title = node_title.getNextSibling().getNextSibling().toHtml() ; parser.reset() ; nodelist = parser.parse(filter_body) ; Node node_body = nodelist.elementAt( 0 ) ; Parser body_parser = new Parser(node_body.toHtml()) ; TextExtractingVisitor visitor = new TextExtractingVisitor() ; body_parser.visitAllNodesWith(visitor) ; body = visitor.getExtractedText() ; // System.out.println(node_summary.getChildren().toHtml()) ; // System.out.println(node_body.toHtml()) ; // System.out.println(title.trim()) ; // System.out.println(constellation.trim()) ; // System.out.println(body.trim()) ; System.out.println(summary.trim()) ; } } |