2011-10-26 109 views
3

我有一個包含關注邏輯的表。JSoup:檢索不包含特定屬性的元素

  1. 對於包含<tr class=hiderow><td class=packagename>...</td></tr>每一行的表顯示列表 - >此行是不可見的。

所以表格可能包含100行,但如果有20行包含class=hiderow,那麼用戶只能在頁面上看到80行。我想檢索這80行(不是100)的名稱。所以我需要解析出不包含class=hiderow的數據。我知道如何使用jsoup獲取每個名稱,我也看到在文檔 :not(selector) elements that do not match the selector.中,但我不確定如何使用它。請幫忙。

編輯我已經弄清楚如何做到這一點。請讓我知道如果有更好的方法。
EDIT2請使用BalusC以下的解決方案。它更乾淨。

public void obtainPackageName(String urlLink) throws IOException{ 
    List<String> pdfList = new ArrayList<String>(); 
    URL url = new URL(urlLink); 
    Document doc = Jsoup.parse(url, 3000); 
    Element table = doc.select("table[id=mastertableid]").first(); 
    Iterator<Element> rowIter = table.select("tr").iterator(); 
    while(rowIter.hasNext()){ 
     Element row = rowIter.next(); 
     if(!row.className().contains("hiderow")){ 
      Element packageName = row.select("td[class=packagename]").first(); 
      if(packageName != null){ 
       pdfList.add(packageName.text()); 
      } 

     } 
    } 
} 

回答

7

你需要關注的元素(這是tr你的情況)上應用的:not(),然後相對元素的CSS選擇器傳遞到其上的元素應該比賽(這是.hiderow在你的情況)。

所以,這應該這樣做:

Document document = Jsoup.connect(urlLink).get(); 
Elements packagenames = document.select("#mastertableid tr:not(.hiderow) td.packagename"); 
List<String> pdfList = new ArrayList<String>(); 

for (Element packagename : packagenames) { 
    pdfList.add(packagename.text()); 
} 
+0

這看起來乾淨多了,我會嘗試。 TY BalusC –

+0

謝謝BalusC。它工作得很好。 TY –

+0

不客氣。 – BalusC

相關問題