2013-08-21 4 views
0

도와주세요. 나는 jsoup 라이브러리와 그 메소드 hasClass을 사용했다. 왜 Cur은 "none!"을 반환합니까? 소스 페이지 :jsoup hasClass가 잘못된 결과를 반환합니다.

<body> 
<div class="pagenav" data-role="vbpagenav" data-pagenumber="2" data-totalpages="223" data-address="showthread.php?t=650495&amp;page=102" data-address2="" data-anchor=""> 
</div> 
</body> 

내 코드 :

Document doc = null; 
String result = ""; 
try { 
    doc = Jsoup.connect(params[0]).get(); 
    Elements body = doc.select("body"); 

    /* Navigation */ 
    String Cur = ""; 
    if (body.hasClass("pagenav")) { 
     Elements Current = body.select("div[data-pagenumber]"); 
     String Cur1 = Current.attr("data-pagenumber"); 
     int cur_page = Integer.parseInt(Cur1); 
     int next_page = cur_page + 1; 
     Cur = Integer.toString(next_page); 
    } else { 
     Cur = "none!"; 
    } 

    result = body.html() + Cur; 

} catch (IOException e) { 
    e.printStackTrace(); 
} 
return result; 

답변

1

당신은 방법 hasClass 잘못된 방법을 사용하고 있습니다.

선택하면 body 태그가 모두 Element 개 개체로 포함 된 컬렉션 Elements body을 만듭니다.

public boolean hasClass(String className) 

은 요소의 몸에 요소 개체 중 하나가 자신의 클래스 속성의 클래스 이름을 가지고 있는지에 true 또는 false를 반환합니다. 컬렉션 Elements body에는 자식 노드가 아닌 모든 body 태그 만 포함되어 있기 때문에 여기서는 잘못된 것을 볼 수 있습니다. body 태그의 클래스 속성은 pagenav으로 설정되어 있지 않으므로 hasClass() 메소드는 false을 반환합니다.


이 문제를 해결하기 위해, 당신은 그들이 pagenav로 설정 클래스 속성이 있는지 여부를 확인 후 body 태그의 모든 자식 노드에 대한 새 컬렉션 Elements 객체를 생성하고해야합니다. 당신은 단지 하나 개의 body 태그를 가질 수 있기 때문에

을 다음과 같이 body 태그를 더블 루프를 필요로 당신의 방법을 선택

, 같은

Elements body = doc.select("body"); 
    Elements bodyChildren = new Elements(); 
    for (Element e : body) { 
     for (Element eChild : e.children()) { 
      bodyChildren.add(eChild); 
     } 
    } 

    if (bodyChildren.hasClass("pagenav")){... 

으로 비록, 바로 선택하는 것이 더 효과적 일 수있다

Element body = doc.select("body").first(); 
    Elements bodyChildren = new Elements(); 
    for (Element e : body.children()) { 
     bodyChildren.add(e); 
    } 

bodyChildren에 실행하면 위의 두 가지 방법 모두 true을 반환합니다.

+0

매력처럼 작동했습니다. 감사 – FARID

관련 문제