HTMLParser使用详解.docx

上传人:b****6 文档编号:4689591 上传时间:2022-12-07 格式:DOCX 页数:27 大小:57.65KB
下载 相关 举报
HTMLParser使用详解.docx_第1页
第1页 / 共27页
HTMLParser使用详解.docx_第2页
第2页 / 共27页
HTMLParser使用详解.docx_第3页
第3页 / 共27页
HTMLParser使用详解.docx_第4页
第4页 / 共27页
HTMLParser使用详解.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

HTMLParser使用详解.docx

《HTMLParser使用详解.docx》由会员分享,可在线阅读,更多相关《HTMLParser使用详解.docx(27页珍藏版)》请在冰豆网上搜索。

HTMLParser使用详解.docx

HTMLParser使用详解

HTMLParser具有小巧,快速的优点,缺点是相关文档比较少(英文的也少),很多功能需要自己摸索。

对于初学者还是要费一些功夫的,而一旦上手以后,会发现HTMLParser的结构设计很巧妙,非常实用,基本你的各种需求都可以满足。

   这里我根据自己这几个月来的经验,写了一点入门的东西,希望能对新学习HTMLParser的朋友们有所帮助。

(不过当年高考本人语文只比及格高一分,所以文法方面的问题还希望大家多多担待)

    

   HTMLParser的核心模块是org.htmlparser.Parser类,这个类实际完成了对于HTML页面的分析工作。

这个类有下面几个构造函数:

   publicParser();

   publicParser(Lexerlexer,ParserFeedbackfb);

publicParser(URLConnectionconnection,ParserFeedbackfb)throwsParserException;

   publicParser(Stringresource,ParserFeedbackfeedback)throwsParserException;

publicParser(Stringresource)throwsParserException;

   publicParser(Lexerlexer);

   publicParser(URLConnectionconnection)throwsParserException;

   和一个静态类publicstaticParsercreateParser(Stringhtml,Stringcharset);

   对于大多数使用者来说,使用最多的是通过一个URLConnection或者一个保存有网页内容的字符串来初始化Parser,或者使用静态函数来生成一个Parser对象。

ParserFeedback的代码很简单,是针对调试和跟踪分析过程的,一般不需要改变。

而使用Lexer则是一个相对比较高级的话题,放到以后再讨论吧。

   这里比较有趣的一点是,如果需要设置页面的编码方式的话,不使用Lexer就只有静态函数一个方法了。

对于大多数中文页面来说,好像这是应该用得比较多的一个方法。

  下面是初始化Parser的例子。

packagecom.baizeju.htmlparsertester;

importjava.io.BufferedReader;

importjava.io.InputStreamReader;

importjava.io.FileInputStream;

importjava.io.File;

import.HttpURLConnection;

import.URL;

importorg.htmlparser.visitors.TextExtractingVisitor;

importorg.htmlparser.Parser;

/**

*@author

*/

publicclassMain{

   privatestaticStringENCODE="GBK";

   privatestaticvoidmessage(StringszMsg){

       try{System.out.println(newString(szMsg.getBytes(ENCODE),System.getProperty("file.encoding")));}catch(Exceptione){}

   }

   publicstaticStringopenFile(StringszFileName){

       try{

           BufferedReaderbis=newBufferedReader(newInputStreamReader(newFileInputStream(newFile(szFileName)),ENCODE));

           StringszContent="";

           StringszTemp;

            

           while((szTemp=bis.readLine())!

=null){

               szContent+=szTemp+"\n";

           }

           bis.close();

           returnszContent;

       }

       catch(Exceptione){

           return"";

       }

   }

    

  publicstaticvoidmain(String[]args){

        

       StringszContent=openFile("E:

/MySites/HTMLParserTester.html");

        

       try{

            //Parserparser=Parser.createParser(szContent,ENCODE);

           //Parserparser=newParser(szContent);

           Parserparser=newParser((HttpURLConnection)(newURL("http:

//127.0.0.1:

8080/HTMLParserTester.html")).openConnection());

        

           TextExtractingVisitorvisitor=newTextExtractingVisitor();

           parser.visitAllNodesWith(visitor);

           StringtextInPage=visitor.getExtractedText();

           message(textInPage);

       }

       catch(Exceptione){            

       }

   }

}

加重的部分测试了几种不同的初始化方法,后面的显示了结果。

大家看到能Parser出内容就可以了,如何操作访问Parser的内容我们在后面讨论。

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的抽象函数。

实际我们用HTMLParser最多的是处理HTML页面,Filter或Visitor相关的函数是必须的,然后第一类和第二类函数是用得最多的。

第一类函数比较容易理解,下面用例子说明一下第二类函数。

下面是用于测试的HTML文件:

DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http:

//www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

白泽居-

//www.w3.org/1999/xhtml">

   

      

--这是注释-->

      白泽居-

白泽居-

   

   白泽居-

测试代码:

/**

*@author

*/

packagecom.baizeju.htmlparsertester;

importjava.io.BufferedReader;

importjava.io.InputStreamReader;

importjava.io.FileInputStream;

importjava.io.File;

import.HttpURLConnection;

import.URL;

importorg.htmlparser.Node;

importorg.htmlparser.util.NodeIterator;

importorg.htmlparser.Parser;

/**

*@author

*/

publicclassMain{

   privatestaticStringENCODE="GBK";

   privatestaticvoidmessage(StringszMsg){

       try{System.out.println(newString(szMsg.getBytes(ENCODE),System.getProperty("file.encoding")));}catch(Exceptione){}

   }

   publicstaticStringopenFile(StringszFileName){

       try{

           BufferedReaderbis=newBufferedReader(newInputStreamReader(newFileInputStream(newFile(szFileName)),ENCODE));

           StringszContent="";

           StringszTemp;

            

           while((szTemp=bis.readLine())!

=null){

               szContent+=szTemp+"\n";

           }

           bis.close();

           returnszContent;

       }

       catch(Exceptione){

           return"";

       }

   }

    

  publicstaticvoidmain(String[]args){

        

       try{

           Parserparser=newParser((HttpURLConnection)(newURL("http:

//127.0.0.1:

8080/HTMLParserTester.html")).openConnection());

        

           for(NodeIteratori=parser.elements();i.hasMoreNodes();){

               Nodenode=i.nextNode();

               message("getText:

"+node.getText());

               message("getPlainText:

"+node.toPlainTextString());

               message("toHtml:

"+node.toHtml());

               message("toHtml(true):

"+node.toHtml(true));

               message("toHtml(false):

"+node.toHtml(false));

               message("toString:

"+node.toString());

               message("=================================================");

           }            

       }

       catch(Exceptione){     

           System.out.println("Exception:

"+e);

       }

   }

}

输出结果:

getText:

!

DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http:

//www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"

getPlainText:

toHtml:

DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http:

//www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

toHtml(true):

DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http:

//www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

toHtml(false):

DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http:

//www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

toString:

DoctypeTag:

!

DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http:

//www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd;beginsat:

0;endsat:

121

=================================================

getText:

getPlainText:

toHtml:

toHtml(true):

toHtml(false):

toString:

Txt(121[0,121],123[1,0]):

\n

=================================================

getText:

head

getPlainText:

白泽居-

toHtml:

白泽居-

toHtml(true):

白泽居-

toHtml(false):

白泽居-

toString:

HEAD:

Tag(123[1,0],129[1,6]):

head

Tag(129[1,6],197[1,74]):

metahttp-equiv="Content-Type"content="text/html;...

Tag(197[1,74],204[1,81]):

title

   Txt(204[1,81],223[1,100]):

白泽居-

   End(223[1,100],231[1,108]):

/title

End(231[1,108],238[1,115]):

/head

=================================================

getText:

getPlainText:

toHtml:

toHtml(true):

toHtml(false):

toString:

Txt(238[1,115],240[2,0]):

\n

=================================================

getText:

htmlxmlns="http:

//www.w3.org/1999/xhtml"

getPlainText:

        

                

               白泽居-

白泽居-

        

       白泽居-

toHtml:

//www.w3.org/1999/xhtml">

       

               

--这是注释-->

               白泽居-

白泽居-

       

       白泽居-

toHtml(true):

//www.w3.org/1999/xhtml">

       

               

--这是注释-->

               白泽居-

白泽居-

       

       白泽居-

toHtml(false):

//www.w3.org/1999/xhtml">

       

               

--这是注释-->

               白泽居-

白泽居-

       

       白泽居-

toString:

Tag(240[2,0],283[2,43]):

htmlxmlns="http:

//www.w3.org/1999/xhtml"

Txt(283[2,43],285[3,0]):

\n

T

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 理化生

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1