2013-06-30 75 views
2

我必須從網站解析某些HTML,但無法更改。我正在使用Jsoup。jsoup getelementsbytag僅獲得層次結構中的html元素高

下面是一些HTML:

<th></th> 
<td> <!-- <td> tags on a high level in the hierarchy. --> 
    <table> 
    <tbody> 
     <tr> 
     <td></td> <!-- <td> tags on a low level in the hierarchy. --> 
     <td></td> 
     <td></td> 
     </tr> 
    </tbody> 
    </table> 
</td> 
<td></td> 
<td></td> 

我想做elementname.getElemementsByTag("td");但這種方法得到所有<td>標籤,但我只想要得到的層次結構中的高級別<td>標籤和跳過那些層次結構中的較低級別。有誰知道這是怎麼做到的嗎?

所有幫助表示讚賞。

回答

3

Jsoup允許您通過document.selector("CSS SELECTOR")通過CSS選擇器獲取元素。

如果你想直接td孩子的table你可以使用CSS selector >, which means direct children。對於你的情況,那麼,你應該使用:

#tableID > tbody > tr > td 

這可以讓你所有td第一級別s的#tableIDtable的。有些事情需要注意:

  • 包括中間> tbody > tr。即使您的原始HTML標記沒有它們,Jsoup也會在解析HTML時創建它們。
  • 你不需要在第一部分有一個ID。你可以擁有任何東西。例如,所有table s的所有第一級td s與.prettytable.pretty > tbody > tr > td

在Jsoup:

  • Elements tds = document.select("#tableID > tbody > tr > td");
  • 或者,如果你想先選擇表(或之前已經選中):
    • Element myTable = document.select("#tableID");
    • Elements tds = myTable.select(" > tbody > tr > td");

最後但並非最不重要的,一個示例代碼從你的例子得到TD S:

import org.jsoup.Jsoup; 
import org.jsoup.nodes.*; 
import org.jsoup.select.*; 

public class JsoupHtmlDirectChildren { 
    public static void main(String[] args) { 
     String html = "" + 
       "<html>                 " + 
       " <body>                " + 
       " <span>HELLO!</span>             " + 
       " <table id=\"myTable\">            " + 
       "  <tbody>               " + 
       "  <tr>               " + 
       "   <th>header</th>            " + 
       "   <!-- <td> tags on a high level in the hierarchy. -->   " + 
       "   <td>high level1            " + 
       "   <table>              " + 
       "    <tbody>             " + 
       "    <tr>             " + 
       "     <!-- <td> tags on a low level in the hierarchy. --> " + 
       "     <td>low level1</td>         " + 
       "     <td>low level2</td>         " + 
       "     <td>low level3</td>         " + 
       "    </tr>             " + 
       "    </tbody>             " + 
       "   </table>             " + 
       "   </td>               " + 
       "   <td>high level2</td>           " + 
       "   <td>high level3</td>           " + 
       "  </tr>               " + 
       "  </tbody>               " + 
       " </table>               " + 
       " </body>                " + 
       "</html>                 "; 
     Document doc = Jsoup.parse(html); 
     // all first level children TD of the #myTable table 
     Elements highLevelTDs = doc.select("#myTable > tbody > tr > td"); 
     System.out.println("QUANTITY FOUND: "+highLevelTDs.size()); 
     for (Element td : highLevelTDs) { 
      System.out.println("\n\n###HIGH LEVEL TD: "+td); 
     } 
    } 
} 

輸出:

QUANTITY FOUND: 3 

###HIGH LEVEL TD: <td>high level1 
<table> 
    <tbody> 
    <tr> 
    <!-- <td> tags on a low level in the hierarchy. --> 
    <td>low level1</td> 
    <td>low level2</td> 
    <td>low level3</td> 
    </tr> 
    </tbody> 
</table> </td> 

###HIGH LEVEL TD: <td>high level2</td> 

###HIGH LEVEL TD: <td>high level3</td> 
+0

你解決了我的問題!再次!非常感謝! – ian

0

我希望您所查看的網站有詳細的HTML標記,而不是您在此處顯示的標記。

如果你的標籤的有描述,如類或ID或其他屬性,它們可用於過濾各自Elements你有興趣。

對於如。要獲得類屬性爲「高」的所有<td>元素,可以這樣做。

Elemenets highTDElements = rootElementName.select("td.high"); 

上的選擇語法的更多細節,請在official site,但只有當有描述,如屬性/ IDS /類等

否則你是DOM遍歷的限制,這將是有益的你應該真正知道元素在哪裏。

+0

這就是問題的全部。這個網站沒有那麼詳細的標記。有些具有類屬性,其他類不具有。這對我不會有幫助。無論如何,非常感謝你的努力,我很感激。 – ian

相關問題