HtmlParser.docx
- 文档编号:2412243
- 上传时间:2022-10-29
- 格式:DOCX
- 页数:11
- 大小:21.23KB
HtmlParser.docx
《HtmlParser.docx》由会员分享,可在线阅读,更多相关《HtmlParser.docx(11页珍藏版)》请在冰豆网上搜索。
HtmlParser
HtmlParser学习笔记--htmlparser简介
htmlparser简介
一、htmlparser对html页面处理的数据结构
HtmlParser主要靠Node、AbstractNode和Tag来表达Html,因为Remark和Text相对简单,此处就将其忽略了。
(1)Node是形成树结构表示HTML的基础,所有的数据表示都是接口Node的实现,Node定义了与页面树结构所表达的页面Page对象,定义了获取父、子、兄弟节点的方法,定义了节点到对应html文本的方法,定义了该节点对应的起止位置,定义了过滤方法,定义了Visitor访问机制。
(2)AbstractNode是Node的一种具体的类实现,起到构成树形结构的作用,除了同具体Node相关的accept方法,toString,toHtml,toPlainTextString方法以外,AbstractNode实现了大多基本的方法,使得它的子类,不用理会具体的树操作。
(3)Tag是具体分析的主要内容。
Tag分成composite的Tag和不能包含其他Tag的简单Tag两类,其中前者的基类是CompositeTag,其子类包含BodyTag,Div,FrameSetTag,OptionTag,等27个子类;而简单Tag有BaseHrefTag、DoctypeTag,FrameTag,ImageTag,InputTag,JspTag,MetaTag,ProcessingInstructionTag这八类。
Node分成三类:
1).RemarkNode:
代表Html中的注释
2).TagNode:
标签节点,是种类最多的节点类型,上述Tag的具体节点类都是
3).TextNode:
文本节点
HtmlParser学习笔记
(一)--创建Parser对象
最近学习了下htmlparser,用这东西解析html还是蛮好用的,为了防止以后忘掉,现总结一下。
首先,介绍下HTMLParser的核心类,org.htmlparser.Parser类,这个类实际完成了对于HTML页面的分析工作。
主要的构造函数如下:
publicParser();
publicParser(Stringresource)throwsParserException;
publicParser(Stringresource,ParserFeedbackfeedback)throwsParserException;
publicParser(URLConnectionconnection)throwsParserException;
publicParser(URLConnectionconnection,ParserFeedbackfb)throwsParserException;
publicParser(Lexerlexer);
publicParser(Lexerlexer,ParserFeedbackfb);
另外,该类还提供了一个静态方法,
publicstaticParsercreateParser(Stringhtml,Stringcharset);
对于大多数使用者来说,使用最多的是通过一个URLConnection或者一个保存有网页内容的字符串来初始化Parser,或者使用静态函数来生成一个Parser对象。
ParserFeedback的代码很简单,是针对调试和跟踪分析过程的,一般不需要改变。
而使用Lexer则是一个相对比较高级的话题,放到以后再讨论吧。
常见的创建Parser的方法,如下:
方法一:
通过url提取网络上的网页
www.qyclass.org
//使用publicParser();构造函数
Parserparser=newParser();
parser.setURL("http:
//www.qyclass.org");
//使用publicParser(URLConnectionconnection)throwsParserException;构造函数
Parserparser=newParser(
(HttpURLConnection)(newURL("http:
//www.qyclass.org")).openConnection()
);
org.htmlparser.http.ConnectionManagermanager=org.htmlparser.lexer.Page.getConnectionManager();
Parserparser=newParser(manager.openConnection("http:
//www.qyclass.org"));
parser.setEncoding("GB2312");
方法二:
提取本地网页文件(通过读文件把网页文件转化成字符串)
//使用静态方法
Parserparser=Parser.createParser(html,charset);
HtmlParserUtils.java公用类
该文件是自己编写的一个可复用的类,专门用来创建Parser对象,这里提供出来是为了方便后面的例子使用,代码如下:
packageorg.qyclass;
importjava.io.IOException;
import.HttpURLConnection;
import.MalformedURLException;
import.URL;
importorg.htmlparser.Parser;
importorg.htmlparser.http.ConnectionManager;
importorg.htmlparser.lexer.Page;
importorg.htmlparser.util.ParserException;
publicclassHtmlParserUtils{
publicstaticParsergetParserWithUrlStr(StringurlStr,Stringencoding){
Parserparser=newParser();
try{
parser.setURL(urlStr);
parser.setEncoding(encoding);
}
catch(ParserExceptione)
{
e.printStackTrace();
returnnull;
}
returnparser;
}
publicstaticParsergetParserWithUrlConn(StringurlStr,Stringencoding){
Parserparser=null;
try{
URLurl=newURL(urlStr);
HttpURLConnectionurlConn=(HttpURLConnection)url.openConnection();
parser=newParser(urlConn);
parser.setEncoding(encoding);
returnparser;
}
catch(ParserExceptione1)
{
e1.printStackTrace();
returnnull;
}
catch(MalformedURLExceptione1)
{
e1.printStackTrace();
returnnull;
}
catch(IOExceptione1)
{
e1.printStackTrace();
returnnull;
}
}
//推荐使用下面这个方法,效率比较高。
publicstaticParsergetParserWithUrlConn2(StringurlStr,Stringencoding){
Parserparser=null;
try{
ConnectionManagermanager=Page.getConnectionManager();
parser=newParser(manager.openConnection(urlStr));
parser.setEncoding(encoding);
returnparser;
}
catch(ParserExceptione)
{
e.printStackTrace();
returnnull;
}
}
publicstaticParsercreateParser(StringhtmlContent,Stringencoding)
{
Parserparser=Parser.createParser(htmlContent,encoding);
returnparser;
}
}
HtmlParser学习笔记
(二)--遍历结点
这次主要演示下,如何迭代一个Node结点的所有根子结点。
首先,先来看下需要解析的html页面的内容,该文件命名为htmlparser.html,详细内容如下所示(该页面以后将会多次使用):
Html代码
DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http:
//www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
//www.w3.org/1999/xhtml">
--注意:
换行符对解析的影响!
-->
td-c1
|
td-c2
|
td-a1 |
td-a2 |
td-b1 |
td-b2 |