2011-09-29 4 views
4

URL에서 텍스트의 div를 가져오고 backtotop 클래스가있는 단락 아래의 모든 것을 제거하려고합니다. 나는 여기에 stackoverflow에 대한 코드의 트래버스 스 니펫을 보았지만 유망 해 보였습니다. 그러나이를 통합하는 방법을 알 수는 없으므로 @el은 div에있는 첫 번째 수를 모두 포함합니다 (p.backtotop).지정된 노드 다음에있는 모든 노드 제거

내 코드 :

@doc = Nokogiri::HTML(open(url)) 
@el = @doc.css("div")[0] 
end 

이송 조각 :

doc = Nokogiri::HTML(code) 
stop_node = doc.css("p.backtotop") 
doc.traverse do |node| 
break if node == stop_node 
# else, do whatever, e.g. `puts node.name` 
end 

답변

3
  1. 합니다.
  2. 원하는 '정지'항목을 찾아 다음 형제를 모두 찾으십시오.
  3. 제거하십시오.

    <body> 
        <div id="b"> 
        <h2>Another Section</h2> 
        <section> 
         <p class="backtotop">Back to Top</p> 
         <p>More Content</p> 
        </section> 
        <p>Even More Content</p> 
        </div> 
    </body> 
    
    require 'nokogiri' 
    doc = Nokogiri::HTML(my_html) 
    div = doc.at('#b') 
    n = div.at('.backtotop') 
    until n==div 
        n.xpath('following-sibling::*').remove 
        n = n.parent 
    end 
    
    puts div 
    #=> <div id="b"> 
    #=>  <h2>Another Section</h2> 
    #=>  <section><p class="backtotop">Back to Top</p> 
    #=>  
    #=>  </section> 
    #=> </div> 
    

    하면 다음 backtotop 항목이 사업부의 루트에하지 않을 수 있습니다 곳

    <body> 
        <div id="a"> 
        <h2>My Section</h2> 
        <p class="backtotop">Back to Top</p> 
        <p>More Content</p> 
        <p>Even More Content</p> 
        </div> 
    </body> 
    
    다음
    require 'nokogiri' 
    doc = Nokogiri::HTML(my_html) 
    div = doc.at('#a') 
    div.at('.backtotop').xpath('following-sibling::*').remove 
    puts div 
    #=> <div id="a"> 
    #=>  <h2>My Section</h2> 
    #=>  <p class="backtotop">Back to Top</p> 
    #=>  
    #=>  
    #=> </div> 
    

    은 더 복잡한 예제 : 예를 들어

귀하의 HTML이 위의 것보다 더 복잡합니다 실제 샘플을 제공하십시오 당신이 원하는 결과와 함께. 이것은 앞으로 제기 될 질문에 대한 좋은 조언입니다.

+0

결과를 압축하는 방법은 무엇입니까? (빈 줄 제거) – ismail

+0

이것은 훌륭한 대답입니다! 감사 – hernanvicente