【问题标题】:Can't remove node in Nokogiri无法删除 Nokogiri 中的节点
【发布时间】:2010-12-03 19:46:12
【问题描述】:

我在 Rails 中遇到了一个关于 Nokogiri 的奇怪问题。我正在尝试删除带有“为什么”类的“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 显示在服务器终端上。

有什么想法吗?

【问题讨论】:

  • 对_why的隐藏引用? :D :D

标签: ruby-on-rails nokogiri


【解决方案1】:

您是否有任何理由重用您的 @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 .. 或者像我上面那样省略整个作业。

【讨论】:

  • 老实说,我不确定我为什么要在上面使用@doc=。无论如何,当我完成任务并执行 doc.css.each 代码时,它就可以工作。我试图弄清楚为什么它会以这种方式工作而不是分配 - 是不是因为分配创建了另一个对象,而我为删除节点而操作的对象不是返回给查看?
猜你喜欢
  • 2010-12-20
  • 2010-12-15
  • 2017-05-27
  • 1970-01-01
  • 2019-01-21
  • 2015-07-16
  • 2015-01-09
  • 1970-01-01
  • 2019-12-28
相关资源
最近更新 更多