HTMLParser使用详解.docx
- 文档编号:4689591
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:27
- 大小:57.65KB
HTMLParser使用详解.docx
《HTMLParser使用详解.docx》由会员分享,可在线阅读,更多相关《HTMLParser使用详解.docx(27页珍藏版)》请在冰豆网上搜索。
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">
--这是注释-->
白泽居-
白泽居-