2017-03-29 7 views
1

의 내가 여러 후손의 깊이와 요소 유형의 혼합물이이 HTML 있다고 가정 해 봅시다 :노코 기리 : 특정 후손이 요소에 클래스를 적용

<div class="foo"> 
    <div class="bar"></div> 
</div> 
<div class="foo"> 
    <div class="baz"></div> 
</div> 
<div class="foo"> 
    <u><span class="duh"> 
     <div class="bar"></div> 
    </span></u> 
</div> 
<div class="foo"> 
    <div class="baz"></div> 
</div> 

을 그리고 난에 BEX의 클래스를 적용 할 이처럼 보이는, 그래서 막대의 클래스를 포함하는 모든 FOOS :

<div class="bex"> 
    <div class="bar"></div> 
</div> 
<div class="foo"> 
    <div class="baz"></div> 
</div> 
<div class="bex"> 
    <u><span class="duh"> 
     <div class="bar"></div> 
    </span></u> 
</div> 
<div class="foo"> 
    <div class="baz"></div> 
</div> 

어떻게합니까 WLD 그 루비/노코 기리와? 온갖 종류의 것을 시도했지만 그것을 얻을 수는 없습니다. 감사.

편집 : 마감, 죄송합니다.

답변

1

두 번째 foo가 발견되지 않은 이유를 궁금해했습니다. 데이터가 손상되었습니다. "duh는 폐쇄되지 않았습니다.

당신이 사용할 수있는 노드를 선택하려면 예를 들어

doc.xpath("//div[@class='foo' and .//div[@class='bar']]") 

: 일

data = %q(<div class="foo"> 
    <div class="bar"></div> 
</div> 
<div class="foo"> 
    <div class="baz"></div> 
</div> 
<div class="foo"> 
    <u><span class="duh"> 
     <div class="bar"></div> 
    </span></u> 
</div> 
<div class="foo"> 
    <div class="baz"></div> 
</div>) 

require 'nokogiri' 

doc = Nokogiri.HTML(data) 

doc.xpath("//div[@class='foo' and .//div[@class='bar']]").each do |node| 
    node["class"] = 'bex' 
end 

puts doc 
+0

감사합니다! duh를 닫지 않는 것에 대해 유감스럽게 생각합니다. 누군가가이 cld가 xpath가 아닌 CSS 타겟팅을 통해 어떻게 수행되는지 설명하는 것 같으면 알기에 관심이있을 것입니다. – j1mmy