實例:http://bbs.sinobuy.cn/index.php/topic,29082.msg48061.html?PHPSESSID=25765715740d5ea729db953abfa52679
研究的重點還是extraction的使用,有空再研究transformation的使用。
1、htmlparser對html頁面處理的數據結構
如圖所示,HtmlParser采用了經典的Composite模式,通過RemarkNode、TextNode、TagNode、AbstractNode和Tag來描述HTML頁面各元素。
* org.htmlparser.Node:
Node接口定義了進行樹形結構節點操作的各種典型操作方法,包括:
節點到html文本、text文本的方法:toPlainTextString、toHtml
典型樹形結構遍歷的方法:getParent、getChildren、getFirstChild、getLastChild、getPreviousSibling、getNextSibling、getText
獲取節點對應的樹形結構結構的頂級節點Page對象方法:getPage
獲取節點起始位置的方法:getStartPosition、getEndPosition
Visitor方法遍歷節點時候方法:accept (NodeVisitor visitor)
Filter方法:collectInto (NodeList list, NodeFilter filter)
Object方法:toString、clone
* org.htmlparser.nodes.AbstractNode:
AbstractNode是形成HTML樹形結構抽象基類,實現了Node接口。
在htmlparser中,Node分成三類:
RemarkNode:代表Html中的注釋
TagNode:標簽節點。
TextNode:文本節點
這三類節點都繼承AbstractNode。
* org.htmlparser.nodes.TagNode:
TagNode包含了對HTML處理的核心的各個類,是所有TAG的基類,其中有分為包含其他TAG的復合節點ComositeTag和不包含其他TAG的葉子節點Tag。
復合節點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
葉子節點TAG:
BaseHrefTag,DoctypeTag,FrameTag,ImageTag,InputTag,JspTag,MetaTag,ProcessingInstructionTag,
2、htmlparser對html頁面處理的算法
主要是如下幾種方式
* 采用Visitor方式訪問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方式訪問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):通過NodeFilter方式獲取
* visitAllNodesWith (NodeVisitor visitor):通過Nodevisitor方式
* extractAllNodesThatMatch (NodeFilter filter):通過NodeFilter方式
org.htmlparser
定義了htmlparser的一些基礎類。其中最為重要的是Parser類。
Parser是htmlparser的最核心的類,其構造函數提供了如下: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
對Visitor和Filter的方法進行了封裝,定義了針對一些常用html元素操作的bean,簡化對常用元素的提取操作。
包括:FilterBean、HTMLLinkBean、HTMLTextBean、LinkBean、StringBean、BeanyBaby等。
3.3、org.htmlparser.nodes
定義了基礎的node,包括:AbstractNode、RemarkNode、TagNode、TextNode等。
3.4、org.htmlparser.tags
定義了htmlparser的各種tag。
3.5、org.htmlparser.filters
定義了htmlparser所提供的各種filter,主要通過extractAllNodesThatMatch (NodeFilter filter)來對html頁面指定類型的元素進行過濾,包括:AndFilter、CssSelectorNodeFilter、 HasAttributeFilter、HasChildFilter、HasParentFilter、HasSiblingFilter、 IsEqualFilter、LinkRegexFilter、LinkStringFilter、NodeClassFilter、 NotFilter、OrFilter、RegexFilter、StringFilter、TagNameFilter、XorFilter
3.6、org.htmlparser.visitors
定義了htmlparser所提供的各種visitor,主要通過visitAllNodesWith (NodeVisitor visitor)來對html頁面元素進行遍歷,包括:HtmlPage、LinkFindingVisitor、NodeVisitor、 ObjectFindingVisitor、StringFindingVisitor、TagFindingVisitor、 TextExtractingVisitor、UrlModifyingVisitor
3.7、org.htmlparser.parserapplications
定義了一些實用的工具,包括LinkExtractor、SiteCapturer、StringExtractor、WikiCapturer,這幾個類也可以作為htmlparser使用樣例。
3.8、org.htmlparser.tests
對各種功能的單元測試用例,也可以作為htmlparser使用的樣例。
文章出處:飛諾網(www.firnow.com):http://dev.firnow.com/course/3_program/java/javajs/20091021/179713.html
名稱: ?4C.ESL | .↗Evon
口號: 遇到新問題?先要尋找一個方案乄而不是創造一個方案こ
mail: 聯系我