java htmlparser 使用教程_Java解析HTML之HTMLParser使用与详解

本文介绍了HTMLParser将解析信息保存为树结构,Node是基础数据类型,阐述了Node中各类方法,如树型结构遍历、获取内容、过滤、Visitor遍历、修改内容等函数。还给出处理HTML页面的测试代码及输出结果,展示了内容的树状结构。

HTMLParser将解析过的信息保存为一个树的结构。Node是信息保存的数据类型基础。请看Node的定义:public interface Node extends Cloneable;Node中包含的方法有几类:对于树型结构进行遍历的函数,这些函数最容易理解:NodegetParent():取得父节点NodeListgetChildren():取得子节点的列表NodegetFirstChild():取得第一个子节点NodegetLastChild():取得最后一个子节点NodegetPreviousSibling():取得前一个兄弟(不好意思,英文是兄弟姐妹,直译太麻烦而且不符合习惯,对不起女同胞了)NodegetNextSibling():取得下一个兄弟节点取得Node内容的函数:StringgetText():取得文本StringtoPlainTextString():取得纯文本信息。StringtoHtml():取得HTML信息(原始HTML)StringtoHtml(boolean verbatim):取得HTML信息(原始HTML)StringtoString():取得字符串信息(原始HTML)PagegetPage():取得这个Node对应的Page对象intgetStartPosition():取得这个Node在HTML页面中的起始位置intgetEndPosition():取得这个Node在HTML页面中的结束位置用于Filter过滤的函数:voidcollectInto(NodeList list, NodeFilter filter):基于filter的条件对于这个节点进行过滤,符合条件的节点放到list中。用于Visitor遍历的函数:voidaccept(NodeVisitor visitor):对这个Node应用visitor用于修改内容的函数,这类用得比较少:voidsetPage(Page page):设置这个Node对应的Page对象voidsetText(String text):设置文本voidsetChildren(NodeList children):设置子节点列表其他函数:voiddoSemanticAction():执行这个Node对应的操作(只有少数Tag有对应的操作)Objectclone():接口Clone的抽象函数。实际我们用HTMLParser最多的是处理HTML页面,Filter或Visitor相关的函数是必须的,然后第一类和第二类函数是用得最多的。第一类函数比较容易理解,下面用例子说明一下第二类函数。下面是用于测试的HTML文件:

白泽居-www.baizeju.com

白泽居-www.baizeju.com

白泽居-www.baizeju.com

白泽居-www.baizeju.com

测试代码:/**

* @author www.baizeju.com

*/

package com.baizeju.htmlparsertester;

import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.io.FileInputStream;

import java.io.File;

import java.net.HttpURLConnection;

import java.net.URL;

import org.htmlparser.Node;

import org.htmlparser.util.NodeIterator;

import org.htmlparser.Parser;

/**

* @author www.baizeju.com

*/

public class Main {

private static String ENCODE = "GBK";

private static void message( String szMsg ) {

try{ System.out.println(new String(szMsg.getBytes(ENCODE), System.getProperty("file.encoding"))); } catch(Exception e ){}

}

public static StringopenFile( String szFileName ) {

try {

BufferedReader bis = new BufferedReader(new InputStreamReader(new FileInputStream( new File(szFileName)), ENCODE) );

String szContent="";

String szTemp;

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

szContent+=szTemp+"\n";

}

bis.close();

return szContent;

}

catch( Exception e ) {

return "";

}

}

public static void main(String[] args) {

try{

Parser parser = new Parser( (HttpURLConnection) (new URL("http://127.0.0.1:8080/HTMLParserTester.html")).openConnection() );

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

Node node = 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( Exception e ) {

System.out.println( "Exception:"+e );

}

}

}输出结果:getText:!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"

getPlainText:

toHtml:

toHtml(true):

toHtml(false):

toString:Doctype Tag : !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd; begins at : 0; ends at : 121

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

getText:

getPlainText:

toHtml:

toHtml(true):

toHtml(false):

toString:Txt (121[0,121],123[1,0]): \n

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

getText:head

getPlainText:白泽居-www.baizeju.com

toHtml:

白泽居-www.baizeju.com

toHtml(true):

白泽居-www.baizeju.com

toHtml(false):

白泽居-www.baizeju.com

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

Tag (129[1,6],197[1,74]): meta http-equiv="Content-Type" content="text/html; ...

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

Txt (204[1,81],223[1,100]):白泽居-www.baizeju.com

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:html xmlns="http://www.w3.org/1999/xhtml"

getPlainText:白泽居-www.baizeju.com白泽居-www.baizeju.com白泽居-www.baizeju.com

toHtml:

白泽居-www.baizeju.com

白泽居-www.baizeju.com

白泽居-www.baizeju.com

toHtml(true):

白泽居-www.baizeju.com

白泽居-www.baizeju.com

白泽居-www.baizeju.com

toHtml(false):

白泽居-www.baizeju.com

白泽居-www.baizeju.com

白泽居-www.baizeju.com

toString:Tag (240[2,0],283[2,43]): html xmlns="http://www.w3.org/1999/xhtml"

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

Tag (285[3,0],292[3,7]): body

Txt (292[3,7],294[4,0]): \n

Tag (294[4,0],313[4,19]): div id="top_main"

Txt (313[4,19],316[5,1]): \n\t

Tag (316[5,1],336[5,21]): div id="logoindex"

Txt (336[5,21],340[6,2]): \n\t\t

Rem (340[6,2],351[6,13]):这是注释Txt (351[6,13],376[8,0]): \n\t\t白泽居-www.baizeju.com\n

Tag (376[8,0],409[8,33]): a href="http://www.baizeju.com"

Txt (409[8,33],428[8,52]):白泽居-www.baizeju.com

End (428[8,52],432[8,56]): /a

Txt (432[8,56],435[9,1]): \n\t

End (435[9,1],441[9,7]): /div

Txt (441[9,7],465[11,0]): \n\t白泽居-www.baizeju.com\n

End (465[11,0],471[11,6]): /div

Txt (471[11,6],473[12,0]): \n

End (473[12,0],480[12,7]): /body

Txt (480[12,7],482[13,0]): \n

End (482[13,0],489[13,7]): /html

=================================================对于第一个Node的内容,对应的就是第一行,这个比较好理解。从这个输出结果中,也可以看出内容的树状结构。或者说是树林结构。在Page内容的第一层Tag,如DOCTYPE,head和html,分别形成了一个最高层的Node节点(很多人可能对第二个和第四个Node的内容有点奇怪。实际上这两个Node就是两个换行符号。HTMLParser把HTML页面内容中的所有换行,空格,Tab等都转换成了相应的Tag,所以就出现了这样的Node。虽然内容少但是级别高,呵呵)getPlainTextString是把用户可以看到的内容都包含了。有趣的有两点,一是

标签中的Title内容是在plainText中的,可能在标题中可见的也算可见吧。另外就是象前面说的,HTML内容中的换行符什么的,也都成了plainText,这个逻辑上好像有点问题。另外可能大家发现toHtml,toHtml(true)和toHtml(false)的结果没什么区别。实际也是这样的,如果跟踪HTMLParser的代码就可以发现,Node的子类是AbstractNode,其中实现了toHtml()的代码,直接调用toHtml(false),而AbstractNode的三个子类RemarkNode,TagNode和TextNode中,toHtml(boolean verbatim)的实现中,都没有处理verbatim参数,所以三个函数的结果是一模一样的。如果你不需要实现你自己的什么特殊处理,简单使用toHtml就可以了。HTML的Node类继承关系如下图(这个是从别的文章Copy的):
按DOM模型解析html文件的工具包 已下是源码列表: META-INF/MANIFEST.MF META-INF/maven/org.htmlparser/htmlparser/pom.properties META-INF/maven/org.htmlparser/htmlparser/pom.xml org.htmlparser.Parser.class org.htmlparser.PrototypicalNodeFactory.class org.htmlparser.beans.BeanyBaby.class org.htmlparser.beans.FilterBean.class org.htmlparser.beans.HTMLLinkBean.class org.htmlparser.beans.HTMLTextBean.class org.htmlparser.beans.LinkBean.class org.htmlparser.beans.StringBean.class org.htmlparser.filters.AndFilter.class org.htmlparser.filters.CssSelectorNodeFilter.class org.htmlparser.filters.HasAttributeFilter.class org.htmlparser.filters.HasChildFilter.class org.htmlparser.filters.HasParentFilter.class org.htmlparser.filters.HasSiblingFilter.class org.htmlparser.filters.IsEqualFilter.class org.htmlparser.filters.LinkRegexFilter.class org.htmlparser.filters.LinkStringFilter.class org.htmlparser.filters.NodeClassFilter.class org.htmlparser.filters.NotFilter.class org.htmlparser.filters.OrFilter.class org.htmlparser.filters.RegexFilter.class org.htmlparser.filters.StringFilter.class org.htmlparser.filters.TagNameFilter.class org.htmlparser.http.HttpHeader.class org.htmlparser.sax.Attributes.class org.htmlparser.sax.Feedback.class org.htmlparser.sax.Locator.class org.htmlparser.sax.XMLReader.class org.htmlparser.scanners.CompositeTagScanner.class org.htmlparser.scanners.JspScanner.class org.htmlparser.scanners.ScriptDecoder.class org.htmlparser.scanners.ScriptScanner.class org.htmlparser.scanners.StyleScanner.class org.htmlparser.tags.AppletTag.class org.htmlparser.tags.BaseHrefTag.class org.htmlparser.tags.BlockquoteTag.class org.htmlparser.tags.BodyTag.class org.htmlparser.tags.Bullet.class org.htmlparser.tags.BulletList.class org.htmlparser.tags.CompositeTag.class org.htmlparser.tags.DefinitionList.class org.htmlparser.tags.DefinitionListBullet.class org.htmlparser.tags.Div.class org.htmlparser.tags.DoctypeTag.class org.htmlparser.tags.FormTag.class org.htmlparser.tags.FrameSetTag.class org.htmlparser.tags.FrameTag.class org.htmlparser.tags.HeadTag.class org.htmlparser.tags.HeadingTag.class org.htmlparser.tags.Html.class org.htmlparser.tags.ImageTag.class org.htmlparser.tags.InputTag.class org.htmlparser.tags.JspTag.class org.htmlparser.tags.LabelTag.class org.htmlparser.tags.LinkTag.class org.htmlparser.tags.MetaTag.class org.htmlparser.tags.ObjectTag.class org.htmlparser.tags.OptionTag.class org.htmlparser.tags.ParagraphTag.class org.htmlparser.tags.ProcessingInstructionTag.class org.htmlparser.tags.ScriptTag.class org.htmlparser.tags.SelectTag.class org.htmlparser.tags.Span.class org.htmlparser.tags.StyleTag.class org.htmlparser.tags.TableColumn.class org.htmlparser.tags.TableHeader.class org.htmlparser.tags.TableRow.class org.htmlparser.tags.TableTag.class org.htmlparser.tags.TextareaTag.class org.htmlparser.tags.TitleTag.class org.htmlparser.util.CharacterReference.class org.htmlparser.util.CharacterReferenceEx.class org.htmlparser.util.DefaultParserFeedback.class org.htmlparser.util.FeedbackManager.class org.htmlparser.util.IteratorImpl.class org.htmlparser.util.NodeTreeWalker.class org.htmlparser.util.ParserFeedback.class org.htmlparser.util.ParserUtils.class org.htmlparser.util.Translate.class org.htmlparser.visitors.HtmlPage.class org.htmlparser.visitors.LinkFindingVisitor.class org.htmlparser.visitors.ObjectFindingVisitor.class org.htmlparser.visitors.StringFindingVisitor.class org.htmlparser.visitors.TagFindingVisitor.class org.htmlparser.visitors.TextExtractingVisitor.class org.htmlparser.visitors.UrlModifyingVisitor.class org/htmlparser/beans/images/Chain16.gif org/htmlparser/beans/images/Chain32.gif org/htmlparser/beans/images/Knot16.gif org/htmlparser/beans/images/Knot32.gif
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值