<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 23,comments - 66,trackbacks - 0
    by lostfire

    這兩天準備做一些網站編程的工作,于是對HtmlParse小研究了一下,目的是快速入手,而不是深入研究,做了一下整理,和大家共同討論一下。
    ?
    一,數據組織分析:

    HtmlParser主要靠Node、AbstractNode和Tag來表達Html,因為Remark和Text相對簡單,此處就將其忽略了。

    • Node是形成樹結構表示HTML的基礎,所有的數據表示都是接口Node的實現,Node定義了與頁面樹結構所表達的頁面Page對象,定義了獲取父、子、兄弟節點的方法,定義了節點到對應html文本的方法,定義了該節點對應的起止位置,定義了過濾方法,定義了Visitor訪問機制。
    • AbstractNode是Node的一種具體的類實現,起到構成樹形結構的作用,除了同具體Node相關的accetp方法,toString,toHtml,toPlainTextString方法以外,AbstractNode實現了大多基本的方法,使得它的子類,不用理會具體的樹操作。
    • Tag是具體分析的主要內容。Tag分成composite的Tag和不能包含其他Tag的簡單Tag兩類,其中前者的基類是CompositeTag,其子類包含BodyTag,Div,FrameSetTag,OptionTag,等27個子類;而簡單Tag有BaseHrefTag、DoctypeTag,FrameTag,ImageTag,InputTag,JspTag,MetaTag,ProcessingInstructionTag這八類。

    Node分成三類:

    • RemarkNode:代表Html中的注釋
    • TagNode:標簽節點,是種類最多的節點類型,上述Tag的具體節點類都是TagNode的實現。
    • TextNode:文本節點
    ?
    二,Visitor方式訪問Html:
    ?
    1,整體解析過程
    • 用一個URL或頁面String做一個Parser
    • 用這個Parser做一個Visitor
    • 使用Parser.visitAllNodeWith(Visitor)來遍歷節點
    • 獲取Visitor遍歷后得到的數據
    2,Visit過程
    • 做解析之前做的事情:visitor.beginParsing();
    • 每次取到一個節點Node,讓該Node接受accept該Visitor
    • 做解析后做的事情:visitor.finishedParsing();
    3,獲取節點的過程:逐步遍歷Html,分析出Node。此部分較為復雜,且對于我們應用來說無需很多了解,暫跳過。
    ?
    4,節點訪問
    節點訪問采用Visitor模式,Node的accept方法和具體Visitor的visit方法是關鍵。
    首先三類Node來accept的方式各不相同:
    • 對于所有TagNode都使用一個accept方法,即TagNode的accept方法。首先判斷是否是標簽結尾,如果是就visitor.visitEndTag (this);否則visitor.visitTag (this);
    • 如果是TextNode,那就visitor.visitStringNode (this);就可以了。
    • 如果是RemarkNode,那就visitor.visitRemarkNode (this);就可以了。


    實際上NodeVisitor里邊這四種visit方法都是空的,因為在不同的Visitor中對于這三類節點的處理是不同的;對于需要處理的節點,只要重載對應的visit方法就行了,如果不處理那就不理會就可以了;另外,如果用戶用自己的Visitor,那么還可以靈活的處理不同類型的節點了。

    系統為我們實現了下面我要介紹的8種Visitor,實際上可以看作是系統給我們演示了如何做各種各樣的Visitor來訪問Html,因為實際上我們要真正來用HtmlParser的話,還需要特定的Visitor,而通過簡單的這些系統提供的Visitor組合是難以做成什么事情的。
    ?
    三,系統Visitor功能簡介:
    • ObjectFindingVisitor:用來找出所有指定類型的節點,采用getTags()來獲取結果。
    • StringBean:用來從一個指定的URL獲取移除了<SCRIPT></SCRIPT>和<PRE></PRE>之間代碼的Html代碼,也可以用做Visitor,用來移除這兩種標簽內部的代碼,采用StringBean.getStrings()來獲取結果。
    • HtmlPage:提取Title,body中的節點和頁面中的TableTag節點。
    • LinkFindingVisitor:找出節點中包含某個鏈接的總個數。
    • StringFindingVisitor:找出遍歷的TextNode中含有指定字符串的個數。
    • TagFindingVisitor:找出指定Tag的所有節點,可以指定多種類型。
    • TextExtractingVisitor:從網頁中把所有標簽去掉來提取文本,這個提取文本的Visitor有時是很實用的,只是注意在提取文本時將標簽的屬性也去掉了,也就是說只剩下標簽之間的文本,例如<a>中的鏈接也去掉了。
    • UrlModifyingVisitor:用來修改網頁中的鏈接。
    四,Filter
    ?
    如果說visitor是遍歷提取信息,當然這個信息可以包括某些節點或者從節點分析出來的更有效的信息,這都取決于我們的Visitor做成什么樣子,那么Filter則目標很明確,就是用來提取節點的。所以說要想用HtmlParser,首先要熟悉上面講到的數據組織。
    ?
    系統定義了17種具體的Filter,包括依據節點父子關系的Filter,連接Filter組合的Filter,依據網頁內容匹配情況的filter,等等。我們也可以implement Filter來做自己的Filter來提取節點。
    ?
    Filter的調用是同Visitor獨立的,因為也無需先filter出一些NodeList,再用Visitor來訪問。調用Filter的方法是:
    NodeList nodeList = myParser.parse(someFilter);
    解析之后,我們可以采用:
    Node[] nodes = nodeList.toNodeArray();
    來獲取節點數組,也可以直接訪問:
    Node node = nodeList.elementAt(i)來獲取Node。
    ?
    另外,在Filter后得到NodeList以后,我們仍然可以使用NodeList的extractAllNodesThatMatch(someFilter)來進一步過濾,同時又可以用NodeList的isitAllNodesWith(someVisitor)來做進一步的訪問。
    這樣,我們可以看到HtmlParser為我們提供了非常方便的Html解析方式,針對不同的應用可以采用visitor來遍歷Html節點提取數據,也可以用Filter來過濾節點,提取出我們所關注的節點,再對節點進行處理。通過這樣的組合,一定能夠找出我們所需要的信息。
    ?
    參考:
    http://htmlparser.sourceforge.net/
    http://www.tkk7.com/rocky/archive/2005/12/21/24997.aspx
    http://www.westing.cn/xblog/?p=90
    posted on 2006-07-02 22:47 rd2pm 閱讀(34208) 評論(23)  編輯  收藏 所屬分類: http tool

    FeedBack:
    # re: HtmlParser初步研究
    2006-07-03 10:26 | 艾塵
    這東西不錯。一年前用來做過項目。可以自定義Tag,還是比較方便。郵件列表也天天更新。  回復  更多評論
      
    # re: HtmlParser初步研究
    2006-07-03 13:12 | rox
    暈倒,我正好用過了,你才寫。
    不過,還是感謝你為大家的勞動。
    呵呵。  回復  更多評論
      
    # re: HtmlParser初步研究
    2006-07-03 14:15 | lostfire
    @rox
    看來還是有很多人用的,大家都用來做什么方面的工作啊?  回復  更多評論
      
    # re: HtmlParser初步研究
    2006-07-03 15:15 | 老妖
    汗,這個東西還真的有人用啊!當時只是初步寫了一個應急的小demo哦,好久沒有上blog了,沒有想到有這么多人捧場,頂一下  回復  更多評論
      
    # re: HtmlParser初步研究
    2006-07-09 15:56 | pysh@163.com
    htmlParser有好多。我用的是叫什么jericho提供的api。如果你也是歡迎交流一下qq 54171690  回復  更多評論
      
    # re: HtmlParser初步研究
    2006-08-18 14:18 | common
    一個例子就行了。  回復  更多評論
      
    # re: HtmlParser初步研究
    2006-10-14 13:18 | czp
    太他媽的志同道和了
    正需要這方面的資料啊




    狂頂!狂頂!狂頂!狂頂!狂頂!狂頂!狂頂!狂頂!狂頂!狂頂!狂頂!狂頂!狂頂!狂頂!狂頂!狂頂!狂頂!狂頂!狂頂!狂頂!狂頂!狂頂!狂頂!狂頂!狂頂!狂頂!狂頂!狂頂!狂頂!狂頂!狂頂!狂頂!狂頂!狂頂!狂頂!狂頂!狂頂!狂頂!狂頂!狂頂!狂頂!狂頂!狂頂!狂頂!狂頂!狂頂!狂頂!狂頂!狂頂!  回復  更多評論
      
    # re: HtmlParser初步研究
    2007-01-05 17:38 | ruozhi
    剛接手一個項目要解析html,先拿它試驗一次.QQ:52386348  回復  更多評論
      
    # re: HtmlParser初步研究
    2007-02-05 00:50 | 涂萬剛
    輝哥!

    我頂  回復  更多評論
      
    # re: HtmlParser初步研究
    2007-04-30 14:10 | 雨夜
    剛學........................  回復  更多評論
      
    # re: HtmlParser初步研究
    2007-05-27 09:47 | liu_UFO
    頂哈,我也剛剛開始學習java ,我的畢業論文是用java 作,需要解析html,提取論壇里面的文字,正在學習htmlparse  回復  更多評論
      
    # re: HtmlParser初步研究
    2007-08-26 15:40 | 鄒江
    @liu_UFO


    你好,我想了解下你以前做提取論壇里面的內容是怎么提取的,源代碼還有嗎  回復  更多評論
      
    # re: HtmlParser初步研究
    2007-10-05 17:55 |
    不錯,不過還是有些不全,對于初學者來講還是不太明白,像node里有很多東西都要用到,但沒有寫。
    謝謝,已經了解了不少!  回復  更多評論
      
    # re: HtmlParser初步研究
    2007-10-28 19:58 | 中華信鴿
    找到了:)  回復  更多評論
      
    # re: HtmlParser初步研究
    2007-11-28 11:56 | 北京seo
    不錯.  回復  更多評論
      
    # re: HtmlParser初步研究
    2009-05-03 13:46 | 11
    相當不錯,對于我這樣的初學者還是非常有用的。  回復  更多評論
      
    # re: HtmlParser初步研究[未登錄]
    2009-11-28 00:43 | dongdong
    你好,我現在在自學HTMLPARSER和爬蟲這里,謝謝你的文章,給我提供了幫助。希望能夠和你成為朋友,向你多多請教。所以。。可以留下一個聯系方式么?QQ或郵箱,不勝榮幸。
    我的郵箱是Spirit.dongdong@gmail.com  回復  更多評論
      
    # re: HtmlParser初步研究
    2009-12-13 15:32 | hahabk
    來學習了.  回復  更多評論
      
    # re: HtmlParser初步研究
    2009-12-25 16:46 | cqyuu
    學習了~!謝謝~!  回復  更多評論
      
    # re: HtmlParser初步研究
    2010-12-03 10:20 | 火地晉
    樓主知道有css parser嗎  回復  更多評論
      
    # re: HtmlParser初步研究
    2011-03-05 18:05 | guolongxin
    你好,我也在做一個這樣的東西,但是不會,你能把你以前做的發我看下嗎?謝謝
    我的郵箱490403992@qq.com  回復  更多評論
      
    # re: HtmlParser初步研究
    2011-11-21 20:24 | 憂傷恛憶
    謝謝樓主,最近正好用到。。。。。。不過還是有些看不明白。。。。  回復  更多評論
      
    # re: HtmlParser初步研究
    2012-04-29 07:40 | newgod
    解析完 http://www.sina.com.cn 要多少毫秒?  回復  更多評論
      

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     

    主站蜘蛛池模板: 国产成人精品日本亚洲11| 亚洲尤码不卡AV麻豆| 亚洲一区二区三区不卡在线播放 | 国产男女猛烈无遮挡免费网站| 亚洲乱亚洲乱淫久久| 毛片免费在线观看| 亚洲福利在线观看| 蜜桃成人无码区免费视频网站| 亚洲AV色香蕉一区二区| 无码人妻丰满熟妇区免费| 亚洲AV成人片色在线观看| 9277手机在线视频观看免费| 亚洲毛片免费观看| AV免费网址在线观看| 亚洲精品国产综合久久久久紧 | 亚洲精品免费在线| 亚洲国产成人在线视频| 免费做爰猛烈吃奶摸视频在线观看| 亚洲色大成网站www久久九 | 免费高清av一区二区三区| 国产午夜亚洲精品不卡免下载| 亚洲AV无码一区二区三区国产| 久久国产精品免费| 综合自拍亚洲综合图不卡区| 最近最好的中文字幕2019免费 | 99re6在线视频精品免费| 亚洲AV色香蕉一区二区| 免费可以看黄的视频s色| 亚洲Av永久无码精品黑人| JLZZJLZZ亚洲乱熟无码| 99久在线国内在线播放免费观看 | 久久亚洲精品中文字幕无码| 曰批视频免费40分钟试看天天| 亚洲一久久久久久久久| 亚洲熟伦熟女新五十路熟妇 | 亚洲精品成a人在线观看☆ | 亚洲综合一区二区精品久久| 浮力影院第一页小视频国产在线观看免费| 国产精品亚洲专区在线播放| 亚洲av无码成h人动漫无遮挡| 可以免费看的卡一卡二|