如何使用Nokogiri删除节点?

Alj*_*jaz 54 ruby nokogiri

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

我有以下代码,但它不会工作:

# 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
Run Code Online (Sandbox Code Playgroud)

xds*_*000 74

试试!

f = Nokogiri::XML.fragment(str)

f.search('.//img').remove
puts f
Run Code Online (Sandbox Code Playgroud)


the*_*Man 10

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

require 'nokogiri'

doc = Nokogiri::HTML('<html><body><img src="foo"><img src="bar"></body></html>')
Run Code Online (Sandbox Code Playgroud)

解析文档后看起来像:

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"
Run Code Online (Sandbox Code Playgroud)

删除<img>标签:

doc.search('img').each do |src|
  src.remove
end
Run Code Online (Sandbox Code Playgroud)

结果是:

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"
Run Code Online (Sandbox Code Playgroud)

  • 我来自未来!:) 感谢您的回答。当我制作 Ruby 脚本来更改大批量的 HTML 文件并自动完成一项(我的琐碎的)工作时,这个人和您的其他人给了我很大帮助。 (3认同)
  • 由于您的块只是在每个可迭代对象上调用一个方法,因此如果您想要更花哨,可以对过程执行符号:`doc.search('img').each(&amp;:remove)`。 (2认同)