2017-04-24 8 views
0

나는 Clojure에 Enlive를 사용하고 있습니다. 특정 div 태그 내에서 li 태그 내에 "title"클래스로 span 태그를 가져 오려고합니다.Clojure, Enlive : 선택기에 다중 단계를 사용할 때 부정을 사용하는 방법?

<div class="main"> 
    <li><span class="title">wanted</span></li> 
    <li><span class="title">wanted</span></li> 
    <li class="dummy"><span class="title">NOT wanted</span></li> 
</div> 

그러나 class 이름이 "dummy"인 li 태그 내의 span 태그는 제외하고 싶습니다. 아래 코드는 예상대로 작동합니다.

(html/select (html/select src [:div.main]) [[:li (html/but 
:li.dummy)] :span.title]) 

질문은 단 한 번의 선택 호출만으로이 작업을 수행하는 방법입니다. 나는 여러 단계에서 '그러나'부정을 사용할 수 없었고 중첩 된 2 개의 선택 호출을 사용하여 끝냈다.

아무도 이것을 하나의 단일 선택 식에 넣을 수 있습니까?

답변

1

내 생각에 당신이 생각해 낸 선택기가 정확히 맞았습니다.

일치하지 않는 이유는 HTML이 올바른 형식이 아니라는 것입니다. 기본 TagSoup 파서가 입력을 위생적으로 처리하려고합니다. 귀하의 단편에는 목록 컨텍스트 외부에 목록 항목이 있으므로 TagSoup는 랩 <div>을 일찍 닫습니다.

당신은 예를 <ol>를 들어, 목록에서 목록 항목을 포장해야한다

: 다음

<div class="main"> 
    <ol> 
     <li><span class="title">wanted</span></li> 
     <li><span class="title">wanted</span></li> 
     <li class="dummy"><span class="title">NOT wanted</span></li> 
    </ol> 
</div> 

는 다음 선택은 그것을 수행해야합니다

(html/select src [:div.main [:li (html/but :.dummy)] :span.title]) 
+0

하는 HTML 예는 잘못하고 OL 태그는 실제로있다 . 선택기가 작동합니다! 교차로 [] 괄호로 여러 변형을 시도했지만 여기에서 대답 한 것은 아닙니다. 이제 부정을 사용할 때 대괄호를 사용하는 방법에 대한 아이디어를 얻었습니다. 고마워요! :) – gini09