2012-03-16 36 views
2

我不想下載任何其他庫,我在說這個:javax.swing.text.html.HTMLEditorKit.Parser如何使用Java自帶的Parser從HTML中提取信息?

如何使用此解析器提取頁面內的重複信息?

說,例如我曾多次在一個頁面的代碼:

<tr> 
     <td class="info1">get this info</td> 
     <td class="info2">get this info</td> 
     <td class="info3">get this info</td> 
    </tr> 

我能有任何示例代碼嗎?

在此先感謝。

回答

4

這是一個流解析器,所以它解析它告訴你它的命中。你應該擴展HTMLEditorKit.ParserCallback與一些類(我會叫它Parser),然後覆蓋你關心的方法。

我相信它只適用於「swing中的html dtd」(請參閱​​here)。如果你想做更復雜的事情,建議你使用一個外部的Java HTML解析庫,比如我之前鏈接過的the ones之一。

這裏是基本的代碼(demo):

import javax.swing.text.html.parser.*; 
import javax.swing.text.html.*; 
import javax.swing.text.*; 
import java.io.*; 

class Parser extends HTMLEditorKit.ParserCallback 
{ 
     private boolean inTD = false; 

     public void handleStartTag(HTML.Tag t, MutableAttributeSet a, int pos) 
     { 
       if(t.equals(HTML.Tag.TD)) 
       { 
         inTD = true; 
       } 
     } 

     public void handleEndTag(HTML.Tag t, int pos) 
     { 
       if(t.equals(HTML.Tag.TD)) 
       { 
         inTD = false; 
       } 
     } 

     public void handleText(char[] data, int pos) 
     { 
       if(inTD) 
       { 
         doSomethingWith(data); 
       } 
     } 

     public void doSomethingWith(char[] data) 
     { 
       System.out.println(data); 
     } 

} 

class HtmlTester 
{ 
     public static void main (String[] args) throws java.lang.Exception 
     {    
      ParserDelegator pd = new ParserDelegator(); 
      pd.parse(new BufferedReader(new InputStreamReader(System.in)), new Parser(), false); 
     } 
} 
3

馬修•富蘭琛回答你的直接的問題。我只是想添加一些建議的比特:在您解析HTML源

  1. 如果你有控制(在某種程度上),你應該考慮改變這種光源發出的信息更好的形式。例如,如果它是一個Web服務器,請讓它遵守Accept頭,並在請求時以(例如)XML或JSON格式提供信息。

  2. 如果你無法控制HTML的源代碼,那麼你就受任何控制它的人的擺佈。如果他們改變HTML結構,你的解析可能會中斷。無論您使用正確的HTML解析器還是(blech)正則表達式,這都適用。

    最好的辦法是使用許可的 HTML解析器(如JSoup),它理解HTML規範的不同版本,並且或多或少地容忍違反規範的HTML。 (使用嚴格的解析器的問題是,諸如丟失的</li>這樣的小錯誤將使頁面不可解析...對於解析器...即使頁面在大多數Web瀏覽器中顯示得都很好)。

  3. 限制自己只使用標準的Java類庫是個壞主意。標準庫通常不提供最佳解決方案。

+1

好的,你已經把我賣給了JSoup。謝謝! – Ozzy 2012-03-17 01:06:09