ruby - 保留 HTML 页面的结构,删除所有文本节点

标签 ruby nokogiri

我想从使用 nokogiri 加载的 html 页面中删除所有文本。例如,如果页面具有以下内容:

<body><script>var x = 10;</script><div>Hello</div><div><h1>Hi</h1></div></body>

我想用 Nokogiri 处理它并在像这样剥离文本后返回如下 html:

<body><script>var x = 10;</script><div></div><div><h1></h1></div></body>

(也就是说,删除实际的 h1 文本、div 之间的文本、p 元素中的文本等,但保留标签。另外,不要删除脚本标签中的文本。)

最佳答案

require 'nokogiri'
html = "<body><script>var x = 10;</script><div>Hello</div><div><h1>Hi</h1></div></body>"
hdoc = Nokogiri::HTML(html)
hdoc.xpath( '//*[text()]' ).each do |el|
  el.content='' unless el.name=="script"
end

puts hdoc
#=> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
#=> <html><body>
#=> <script>var x = 10;</script><div></div>
#=> <div><h1></h1></div>
#=> </body></html>

警告:因为您没有指定如何处理类似 <div>foo<h1>bar</h1></div> 的案例以上可能会或可能不会做你期望的。或者,以下可能符合您的需求:

hdoc.xpath( '//text()' ).each do |el|
  el.remove unless el.parent.name=="script"
end

更新

这是一个更优雅的解决方案,它使用单个 xpath 来选择不属于 <script> 的所有文本节点。元素。我添加了更多文本节点来展示它如何处理它们。

require 'nokogiri'
hdoc = Nokogiri::HTML <<ENDHTML
  <body>
  <script>var x = 10;</script>
  <div>Hello</div>
  <div>foo<h1>Hi</h1>bar</div>
  </body>
ENDHTML
hdoc.xpath( '//text()[not(parent::script)]' ).each{ |text| text.remove }
puts hdoc
#=> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
#=> <html><body>
#=> <script>var x = 10;</script><div></div>
#=> <div><h1></h1></div>
#=> </body></html>

对于 Ruby 1.9,内容更简单:

hdoc.xpath( '//text()[not(parent::script)]' ).each(&:remove)

关于ruby - 保留 HTML 页面的结构,删除所有文本节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4530027/

相关文章:

ruby - 安装 RedCloth 时出现 RubyGems 问题

javascript - 将 ruby​​ 插值嵌入到 html 字符串(变量)的 &lt;script&gt; 标签中?

ruby-on-rails - 使用 Nokogiri 查找带有文本的链接时如何避免出现 "Invalid byte sequence"

ruby - 确保值在集合中,如果不在集合中则设置默认值

ruby-on-rails - Time.now 在测试环境中返回错误结果

ruby - 将 Nokogiri 与多个搜索元素结合使用

Ruby 从 html 中提取链接

css - tr 是否限制特定类 Ruby Nokogiri

ruby - 我如何使用 Nokogiri 和 Ruby 从带有嵌套表格的 HTML 中抓取值?

ruby-on-rails - 如何在 rails 中处理 redis pub/sub