2012-09-21 159 views
4

我正在實現一個網絡機器人,它必須從頁面獲取所有鏈接並選擇需要的鏈接。除了我遇到了一個鏈接位於「表格」或「跨度」標籤內的探針之外,我已經完成了所有工作。 這裏是我的代碼片段:Jsoup從頁面獲取所有鏈接

Document doc = Jsoup.connect(url) 
    .timeout(TIMEOUT * 1000) 
    .get(); 
Elements elts = doc.getElementsByTag("a"); 

而這裏的例子HTML:

<table> 
    <tr><td><a href="www.example.com"></a></td></tr> 
</table> 

我的代碼將無法獲取等環節。使用doc.select也無濟於事。我的問題是,如何從頁面獲取所有鏈接?

編輯:我想我知道問題在哪裏。我遇到的頁面寫得非常糟糕,HTML驗證器會拋出大量的錯誤。這會導致問題嗎?

回答

4

一般來說Jsoup可以處理最糟糕的HTML。轉儲HTML作爲JSoup使用它(你可以簡單的輸出doc.toString())。

提示:使用select()而不是getElementsByX(),其更快,更靈活。

Elements elts = doc.select("a");(編輯)

以下是關於選擇-API的概述:http://jsoup.org/cookbook/extracting-data/selector-syntax

+0

對不起,我不明白這句話:「轉儲HTML作爲JSoup使用它(你可以簡單輸出doc.toString())「。你能寫得更清楚嗎? –

+0

打印'文檔'(包含解析的HTML,因爲Jsoup會用它來選擇元素)。通過'System.out.println(doc)'或將其寫入文件。現在你可以檢查你需要的元素。順便說一句。請參閱編輯我的答案(錯過了用選擇器替換getElements)。 – ollo

0

試試這個代碼

String url = "http://test.com"; 
Document doc = null; 
     try { 
      doc = Jsoup.connect(url).get(); 
      Elements links = doc.select(<i>"a[href]"<i>); 
      Element link; 

       for(int j=0;j<150;j++){ 
        link=links.get(j); 
        System.out.println("a= " link.attr("abs:href").toString()); 
      } 

     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     }