<p style="color:rgb(73,73,73)"><span style="color:rgb(0,0,0)">声明:转载自http://www.cnblogs.com/loveyakamoz/archive/2011/07/27/2118937.html</span></p>
<p style="color:rgb(73,73,73)"><span style="color:rgb(0,0,0)">HTMLParser</span>具有小巧,快速的优点,缺点是相关文档比较少(英文的也少),很多功能需要自己摸索。对于初学者还是要费一些功夫的,而一旦上手以后,会发现HTMLParser的结构设计很巧妙,非常实用,基本你的各种需求都可以满足。<br> 这里我根据自己这几个月来的经验,写了一点入门的东西,希望能对新学习HTMLParser的朋友们有所帮助。(不过当年高考本人语文只比及格高一分,所以文法方面的问题还希望大家多多担待)<br> <br> HTMLParser的核心模块是org.htmlparser.Parser类,这个类实际完成了对于HTML页面的分析工作。这个类有下面几个构造函数:<br> public Parser ();<br> public Parser (Lexer lexer, ParserFeedback fb);<br> public Parser (URLConnection connection, ParserFeedback fb) throws ParserException;<br> public Parser (String resource, ParserFeedback feedback) throws ParserException;<br> public Parser (String resource) throws ParserException;<br> public Parser (Lexer lexer);<br> public Parser (URLConnection connection) throws ParserException;<br> 和一个静态类public static Parser createParser (String html, String charset);<br> <br> 对于大多数使用者来说,使用最多的是通过一个URLConnection或者一个保存有网页内容的字符串来初始化Parser,或者使用静态函数来生成一个Parser对象。ParserFeedback的代码很简单,是针对调试和跟踪分析过程的,一般不需要改变。而使用Lexer则是一个相对比较高级的话题,放到以后再讨论吧。<br> 这里比较有趣的一点是,如果需要设置页面的编码方式的话,不使用Lexer就只有静态函数一个方法了。对于大多数中文页面来说,好像这是应该用得比较多的一个方法。<br> <br> 下面是初始化Parser的例子。</p>
<p style="color:rgb(73,73,73)"><span style="color:rgb(0,0,0)"><br> package com.baizeju.htmlparsertester;</span><br> import java.io.BufferedReader;<br> import java.io.InputStreamReader;<br> import java.io.FileInputStream;<br> import java.io.File;<br> import java.net.HttpURLConnection;<br> import java.net.URL;<br> <br> import org.htmlparser.visitors.TextExtractingVisitor;<br> <br> import org.htmlparser.Parser;<br> <br> /**<br> * @author www.baizeju.com<br> */<br> public class Main {<!-- --><br> private static String ENCODE = "GBK";<br> private static void message( String szMsg ) {<!-- --><br> try{System.out.println(new String(szMsg.getBytes(ENCODE), System.getProperty("file.encoding"))); } catch(Exception e ){}<br> }<br> public static String openFile( String szFileName ) {<!-- --><br> try {<!-- --><br> BufferedReader bis = new BufferedReader(new InputStreamReader(new FileInputStream( new File(szFileName)), ENCODE) );<br> String szContent="";<br> String szTemp;<br> <br> while ( (szTemp = bis.readLine()) != null) {<!-- --><br> szContent+=szTemp+"\n";<br> }<br> bis.close();<br> return szContent;<br> }<br> catch( Exception e ) {<!-- --><br> return "";<br> }<br> }<br> <br> public static void main(String[] args) {<!-- --><br> <br> String szContent = openFile( "E:/My Sites/HTMLParserTester.html");<br> <br> try{<!-- --><br> <strong> //Parser parser = Parser.createParser(szContent, ENCODE);<br> //Parser parser = new Parser( szContent );<br> </strong> Parser parser = new Parser( (HttpURLConnection) (new URL("http://127.0.0.1:8080/HTMLParserTester.html")).openConnection() );<br> <br> TextExtractingVisitor visitor = new TextExtractingVisitor();<br> parser.visitAllNodesWith(visitor);<br> String textInPage = visitor.getExtractedText();<br> <br> message(textInPage);<br> }<br> catch( Exception e ) { <br> }<br> }<br> }<br> 加重的部分测试了几种不同的初始化方法,后面的显示了结果。大家看到能Parser出内容就可以了,如何操作访问Parser的内容我们在后面讨论。</p>
<p align="left" style="color:rgb(73,73,73)"><span style="color:rgb(0,0,0)">HTMLParser</span>将解析过的信息保存为一个树的结构。Node是信息保存的数据类型基础。<br> 请看Node的定义:<br> public interface Node extends Cloneable;<br> <br> <strong>Node中包含的方法有几类:<br> 对于树型结构进行遍历的函数,这些函数最容易理解:</strong><br> Node getParent ():取得父节点<br> NodeList getChildren ():取得子节点的列表<br> Node getFirstChild ():取得第一个子节点<br> Node getLastChild ():取得最后一个子 |
|