如何使用Nokogiri删除节点?

66

如何使用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 的样例值吗? - Andy Gaskell
1
str = '<img src="http://www.canadascapital.gc.ca/data/2/rec_imgs/5005_Pepsi_H1NB.gif"/> testt<a href="#">test</a>tfbu'str = '<img src="http://www.canadascapital.gc.ca/data/2/rec_imgs/5005_Pepsi_H1NB.gif"/> testt<a href="#">test</a>tfbu' - all jazz
1
已将此内容添加至问题中。下次请编辑问题以添加所需信息,这比从问题和评论中组装信息要容易得多。 - Chuck van der Linden
我需要移除页面上的所有脚本 $page_html = Nokogiri::HTML.parse($browser.html) ; $page_html.search('//script').each{|x| x.remove} ; # 真是太好了。谢谢 - Duck1337
2个回答

87

试一试吧!

f = Nokogiri::XML.fragment(str)

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

17

我更喜欢使用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"

移除 <img> 标签:

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"

2
由于您的块只是在每个可迭代对象上调用一个方法,如果您想要更加高级,可以使用符号转换为过程:doc.search('img').each(&:remove) - Tyler James Young
是的,但是当时在2013年,我们没有那种花哨的能力。 - the Tin Man
3
我来自未来!:) 感谢你的回答。你的这篇以及其他回答对我非常有帮助,因为我正在编写Ruby脚本来批量修改HTML文件并自动化我的工作(其中一个琐碎的组成部分)。 - Tyler James Young
知道答案有所帮助是很好的事情;这也是 Stack Overflow 的全部意义,教授并传递我们所学到的知识。 - the Tin Man

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接