Не могу удалить узел в Нокогири - PullRequest
3 голосов
/ 03 декабря 2010

У меня немного странная проблема с Nokogiri в Rails. Я пытаюсь удалить тег «p» с классом «почему». У меня есть следующий код, который не работает:

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>

Я знаю, что код rails входит в цикл if, потому что logger.info отображается на серверном терминале.

Есть идеи?

1 Ответ

5 голосов
/ 03 декабря 2010

Есть ли причина, по которой вы повторно используете переменную @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 .. или просто пропустите все назначение, как у меня выше.

...