2011-10-26 3 views
3

다음 논리를 포함하는 테이블이 있습니다.JSoup : 특정 속성을 포함하지 않는 요소 검색

  1. 이름 <tr class=hiderow><td class=packagename>...</td></tr>를 포함하는 모든 행에 대해
  2. 의 테이블 표시 목록 ->이 행이 표시되지 않습니다.

그래서 테이블은 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

당신은 요소가해야 하지 일치 (.hiderow 인하는 그것으로 요소 상대 CSS 선택기를 통과 한 후 (귀하의 경우 tr 인) 관심의 요소에 :not()을 적용 할 필요가 귀하의 경우).

그래서,이 수행해야합니다

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

관련 문제