實(shí)例:http://bbs.sinobuy.cn/index.php/topic,29082.msg48061.html?PHPSESSID=25765715740d5ea729db953abfa52679
研究的重點(diǎn)還是extraction的使用,有空再研究transformation的使用。
1、htmlparser對(duì)html頁(yè)面處理的數(shù)據(jù)結(jié)構(gòu)
如圖所示,HtmlParser采用了經(jīng)典的Composite模式,通過(guò)RemarkNode、TextNode、TagNode、AbstractNode和Tag來(lái)描述HTML頁(yè)面各元素。
* org.htmlparser.Node:
Node接口定義了進(jìn)行樹(shù)形結(jié)構(gòu)節(jié)點(diǎn)操作的各種典型操作方法,包括:
節(jié)點(diǎn)到html文本、text文本的方法:toPlainTextString、toHtml
典型樹(shù)形結(jié)構(gòu)遍歷的方法:getParent、getChildren、getFirstChild、getLastChild、getPreviousSibling、getNextSibling、getText
獲取節(jié)點(diǎn)對(duì)應(yīng)的樹(shù)形結(jié)構(gòu)結(jié)構(gòu)的頂級(jí)節(jié)點(diǎn)Page對(duì)象方法:getPage
獲取節(jié)點(diǎn)起始位置的方法:getStartPosition、getEndPosition
Visitor方法遍歷節(jié)點(diǎn)時(shí)候方法:accept (NodeVisitor visitor)
Filter方法:collectInto (NodeList list, NodeFilter filter)
Object方法:toString、clone
* org.htmlparser.nodes.AbstractNode:
AbstractNode是形成HTML樹(shù)形結(jié)構(gòu)抽象基類(lèi),實(shí)現(xiàn)了Node接口。
在htmlparser中,Node分成三類(lèi):
RemarkNode:代表Html中的注釋
TagNode:標(biāo)簽節(jié)點(diǎn)。
TextNode:文本節(jié)點(diǎn)
這三類(lèi)節(jié)點(diǎn)都繼承AbstractNode。
* org.htmlparser.nodes.TagNode:
TagNode包含了對(duì)HTML處理的核心的各個(gè)類(lèi),是所有TAG的基類(lèi),其中有分為包含其他TAG的復(fù)合節(jié)點(diǎn)ComositeTag和不包含其他TAG的葉子節(jié)點(diǎn)Tag。
復(fù)合節(jié)點(diǎn)CompositeTag:
AppletTag,BodyTag,Bullet,BulletList,DefinitionList,DefinitionListBullet,Div,FormTag,FrameSetTag,HeadingTag,
HeadTag,Html,LabelTag,LinkTag,ObjectTag,ParagraphTag,ScriptTag,SelectTag,Span,StyleTag,TableColumn,
TableHeader,TableRow,TableTag,TextareaTag,TitleTag
葉子節(jié)點(diǎn)TAG:
BaseHrefTag,DoctypeTag,FrameTag,ImageTag,InputTag,JspTag,MetaTag,ProcessingInstructionTag,
2、htmlparser對(duì)html頁(yè)面處理的算法
主要是如下幾種方式
* 采用Visitor方式訪問(wèn)Html
public static void testVisitorAll()
{
try
{
Parser parser = new Parser();
parser.setURL("http://www.google.com");
parser.setEncoding(parser.getEncoding());
NodeVisitor visitor = new NodeVisitor()
{
public void visitTag(Tag tag)
{
logger.info("testVisitorAll() Tag name is :" + tag.getTagName() + " Class is :" + tag.getClass());
}
};
parser.visitAllNodesWith(visitor);
} catch (ParserException e)
{
e.printStackTrace();
}
}
* 采用Filter方式訪問(wèn)html
public static void testLinkTag()
{
try
{
NodeFilter filter = new NodeClassFilter(LinkTag.class);
Parser parser = new Parser();
parser.setURL("http://www.google.com");
parser.setEncoding(parser.getEncoding());
NodeList list = parser.extractAllNodesThatMatch(filter);
for (int i = 0; i < list.size(); i++)
{
LinkTag node = (LinkTag) list.elementAt(i);
logger.fatal("testLinkTag() Link is :" + node.extractLink());
}
} catch (Exception e)
{
e.printStackTrace();
}
}
* 采用org.htmlparser.beans方式
public static void testLinkBean()
{
Parser parser = new Parser();
LinkBean linkBean = new LinkBean();
linkBean.setURL("http://www.google.com");
URL[] urls = linkBean.getLinks();
for (int i = 0; i < urls.length; i++)
{
URL url = urls[i];
logger.fatal("testLinkBean() -url is :" + url);
}
}
* parse (NodeFilter filter):通過(guò)NodeFilter方式獲取
* visitAllNodesWith (NodeVisitor visitor):通過(guò)Nodevisitor方式
* extractAllNodesThatMatch (NodeFilter filter):通過(guò)NodeFilter方式
org.htmlparser
定義了htmlparser的一些基礎(chǔ)類(lèi)。其中最為重要的是Parser類(lèi)。
Parser是htmlparser的最核心的類(lèi),其構(gòu)造函數(shù)提供了如下:Parser.createParser (String html, String charset)、 Parser ()、Parser (Lexer lexer, ParserFeedback fb)、Parser (URLConnection connection, ParserFeedback fb)、Parser (String resource, ParserFeedback feedback)、 Parser (String resource)
org.htmlparser.beans
對(duì)Visitor和Filter的方法進(jìn)行了封裝,定義了針對(duì)一些常用html元素操作的bean,簡(jiǎn)化對(duì)常用元素的提取操作。
包括:FilterBean、HTMLLinkBean、HTMLTextBean、LinkBean、StringBean、BeanyBaby等。
3.3、org.htmlparser.nodes
定義了基礎(chǔ)的node,包括:AbstractNode、RemarkNode、TagNode、TextNode等。
3.4、org.htmlparser.tags
定義了htmlparser的各種tag。
3.5、org.htmlparser.filters
定義了htmlparser所提供的各種filter,主要通過(guò)extractAllNodesThatMatch (NodeFilter filter)來(lái)對(duì)html頁(yè)面指定類(lèi)型的元素進(jìn)行過(guò)濾,包括:AndFilter、CssSelectorNodeFilter、 HasAttributeFilter、HasChildFilter、HasParentFilter、HasSiblingFilter、 IsEqualFilter、LinkRegexFilter、LinkStringFilter、NodeClassFilter、 NotFilter、OrFilter、RegexFilter、StringFilter、TagNameFilter、XorFilter
3.6、org.htmlparser.visitors
定義了htmlparser所提供的各種visitor,主要通過(guò)visitAllNodesWith (NodeVisitor visitor)來(lái)對(duì)html頁(yè)面元素進(jìn)行遍歷,包括:HtmlPage、LinkFindingVisitor、NodeVisitor、 ObjectFindingVisitor、StringFindingVisitor、TagFindingVisitor、 TextExtractingVisitor、UrlModifyingVisitor
3.7、org.htmlparser.parserapplications
定義了一些實(shí)用的工具,包括LinkExtractor、SiteCapturer、StringExtractor、WikiCapturer,這幾個(gè)類(lèi)也可以作為htmlparser使用樣例。
3.8、org.htmlparser.tests
對(duì)各種功能的單元測(cè)試用例,也可以作為htmlparser使用的樣例。
文章出處:飛諾網(wǎng)(www.firnow.com):http://dev.firnow.com/course/3_program/java/javajs/20091021/179713.html
名稱: ?4C.ESL | .↗Evon
口號(hào): 遇到新問(wèn)題?先要尋找一個(gè)方案乄而不是創(chuàng)造一個(gè)方案こ
mail: 聯(lián)系我