如何使用 Nokogiri 删除节点?

Posted

技术标签:

【中文标题】如何使用 Nokogiri 删除节点?【英文标题】:How do I remove a node with Nokogiri? 【发布时间】:2010-12-15 01:49:38 【问题描述】:

如何使用 Nokogiri 删除 <img> 标签?

我有以下代码,但它不起作用:

# str = '<img src="canadascapital.gc.ca/data/2/rec_imgs/5005_Pepsi_H1NB.gif"/…; testt<a href="#">test</a>tfbu' 

f = Nokogiri::XML.fragment(str)
f.search('//img').each do |node| 
  node.remove
end
puts f

【问题讨论】:

您能否发布str 的示例值? str = 'canadascapital.gc.ca/data/2/rec_imgs/5005_Pepsi_H1NB.gif"> testttesttfbu' 将其添加到问题中。下次只需编辑问题以添加所要求的信息,这比将问题中的内容和 cmets 组装起来要容易得多。 我需要删除页面上的所有脚本 $page_html = Nokogiri::HTML.parse($browser.html) ; $page_html.search('//script').each|x| x.remove ; # 工作就像一个魅力。 ty 【参考方案1】:

试一试!

f = Nokogiri::XML.fragment(str)

f.search('.//img').remove
puts f

【讨论】:

【参考方案2】:

我更喜欢 CSS 而不是 XPath,因为它通常更具可读性。切换到 CSS:

require 'nokogiri'

doc = Nokogiri::HTML('<html><body><img src="foo"><img src="bar"></body></html>')

解析后的文档如下:

doc.to_html
# => "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\">\n<html><body>\n<img src=\"foo\"><img src=\"bar\">\n</body></html>\n"

删除&lt;img&gt; 标签:

doc.search('img').each do |src|
  src.remove
end

结果:

doc.to_html
# => "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\">\n<html><body></body></html>\n"

【讨论】:

由于您的块只是在每个可迭代对象上调用一个方法,如果您想变得花哨,可以对 proc 执行符号:doc.search('img').each(&amp;:remove) 是的,但在 2013 年的时候,我们还没有那种奇特的能力。 我来自未来! :) 感谢您的回答。在我编写 Ruby 脚本来更改大量 HTML 文件并使自己摆脱(我的)工作的琐碎部分时,这个人和其他人一直在帮助我很多。 很高兴知道答案的帮助;这就是 SO 的全部意义,即教授和传递我们所学的知识。

以上是关于如何使用 Nokogiri 删除节点?的主要内容,如果未能解决你的问题,请参考以下文章

创建“Nokogiri::XML”或“Nokogiri::HTML”对象时如何避免创建无意义的空白文本节点

如何使用 Nokogiri 解析 HTML 表格?

如何使用 Nokogiri 获取没有任何文本内容的完整 HTML

Nokogiri,如何删除不必要的 html 内容?

如何使用 Nokogiri Builder 创建具有命名空间根元素的 XML 文档

如何使用 Nokogiri 访问属性