2010-12-03 5 views
3

Nokogiri in Rails에서 이상한 문제가 있습니다. 나는 "왜"의 클래스로 "p"태그를 제거하려고합니다. 나는 작동하지 않는 다음 코드를 가지고 :Nokogiri에서 노드를 제거 할 수 없습니다.

def test_grab 
    f = File.open("public/test.html") 
    @doc = Nokogiri::HTML.parse(f) 
    f.close 
    @doc = @doc.css("p") 
    @doc.each do |p| 
    if p["class"] == "why" 
     logger.info p.values 
     p.remove 
    end 
    end 
end 

인 test.html :

<html> 
<head> 
    <title>Test</title> 
</head> 
<body> 
    <p>Test data</p> 
    <p>More <a href="http://stackoverflow.com">Test Data</a></p> 
    <p class="why">Why is this still here?</p> 
</body> 
</html> 

출력 HTML 소스 :

<p>Test data</p> 
<p>More <a href="http://stackoverflow.com">Test Data</a></p> 
<p class="why">Why is this still here?</p> 

내가 레일 코드가 들어가는 것을 알고 if loopger.info가 서버 터미널에 나타나기 때문에 반복됩니다.

아이디어가 있으십니까?

+1

_why에 대한 숨겨진 참조는 무엇입니까? : D : D –

답변

5

@doc 인스턴스 변수를 다시 사용하는 이유가 있습니까?

이런 문제를 해결할 때는 Rails 오버 헤드없이 동일한 코드를 평가하는 것이 가장 좋습니다.

require 'nokogiri' 

doc = Nokogiri::HTML(DATA) 
doc.css("p").each do |p| 
    p.remove if p["class"] == "why" 
end 

__END__ 
<html> 
<head> 
    <title>Test</title> 
</head> 
<body> 
    <p>Test data</p> 
    <p>More <a href="http://stackoverflow.com">Test Data</a></p> 
    <p class="why">Why is this still here?</p> 
</body> 
</html> 

반환 : 예를 들어

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> 
<html> 
<head><title>Test</title></head> 
<body> 
    <p>Test data</p> 
    <p>More <a href="http://stackoverflow.com">Test Data</a></p> 

</body> 
</html> 

지금 시도 paragraphs = @doc.css("p")을하고 내가 위에서 가지고있는 것처럼 다음 paragraphs.each ..하거나 전체 할당을 생략합니다.

+0

정직하게 말하면 왜 @ doc =을 사용하고 있는지 확실하지 않습니다. 그럼에도 불구하고, 내가 할당을 꺼내서 doc.css.each 코드를 수행하면 작동한다. 내가 왜 이런 식으로 작동하지만 할당이 아니라 주위에 내 머리를 얻으려고 노력하고 있어요 - 과제가 다른 Object를 생성하고 노드를 제거하기 위해 조작 한 Object가 반환 된 것이 아니기 때문입니까? 전망? –

관련 문제