【问题标题】:How do I remove a node with Nokogiri?如何使用 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

标签: ruby nokogiri


【解决方案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 的全部意义,即教授和传递我们所学的知识。
    猜你喜欢
    • 2017-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多