删除Ruby中的特定HTML元素

删除Ruby中的特定HTML元素,html,ruby,Html,Ruby,我在Ruby中见过基于白名单的HTML清理程序,但我需要的是相反的,我只需要从页面中删除链接就可以进行PDF转换。我尝试了清理,但它不符合我的需要,因为很难猜测在获取的页面上将使用哪些HTML元素,因此我可以将它们添加到列表中 如果我的意见是 <a href="link">Link!</a> <b>Bold Text</b> <div>A div!</div> 我想要 Link! <b>Bold Text<

我在Ruby中见过基于白名单的HTML清理程序,但我需要的是相反的,我只需要从页面中删除链接就可以进行PDF转换。我尝试了清理,但它不符合我的需要,因为很难猜测在获取的页面上将使用哪些HTML元素,因此我可以将它们添加到列表中

如果我的意见是

<a href="link">Link!</a>
<b>Bold Text</b>
<div>A div!</div>
我想要

Link!
<b>Bold Text</b>
<div>A div!</div>
作为输出


Ruby是否有“基于黑名单的消毒剂”

您需要一个HTML解析器,例如。它允许您浏览文档,搜索特定节点标记并对其执行操作:

require 'nokogiri'

html = '<a href="link">Link!</a>
<b>Bold Text</b>
<div>A div!</div>
'

doc = Nokogiri.HTML(html)

doc.search('a').each do |a|
  a.replace(a.content)
end

puts doc.to_html
其结果是:

链接 粗体文本 跳水!
注意,Nokogiri对代码做了一些修改,提供了适当的和标记。它不必这样做,我可以告诉它使用并返回一个文档片段,但通常我们让它自己做。它允许您浏览文档,搜索特定节点标记并对其执行操作:

require 'nokogiri'

html = '<a href="link">Link!</a>
<b>Bold Text</b>
<div>A div!</div>
'

doc = Nokogiri.HTML(html)

doc.search('a').each do |a|
  a.replace(a.content)
end

puts doc.to_html
其结果是:

链接 粗体文本 跳水!
注意,Nokogiri对代码做了一些修改,提供了适当的和标记。不必,我可以告诉它使用并返回一个文档片段,但通常我们让它做它自己的事情。

铁皮人的回答有一个小变化,仍然使用:

这里的两个区别是:

在搜索上使用css可以稍微更具体地说明所使用的选择器,尽管它没有提供功能上的区别,但更重要的是

通过替换为内部html,我们在链接中保留了可能的标记。例如,给定标记:

!

然后替换为.content将产生:

嗨,妈妈

而替换为.inner_html会产生:

嗨,妈妈


铁皮人的回答略有变化,仍使用:

这里的两个区别是:

在搜索上使用css可以稍微更具体地说明所使用的选择器,尽管它没有提供功能上的区别,但更重要的是

通过替换为内部html,我们在链接中保留了可能的标记。例如,给定标记:

!

然后替换为.content将产生:

嗨,妈妈

而替换为.inner_html会产生:

嗨,妈妈


Rails 4.2可以在开箱即用的情况下实现这一点。对于旧版本,需要使用gem“rails html消毒器”

仅列出提供的标记和属性 或者使用丝瓜的目标洗涤器

Rails::Html::TargetScrubler

PermitScruber在清理中选择允许的标记和属性,Rails::Html::TargetScrubler将它们作为删除的目标

scrubber = Rails::Html::TargetScrubber.new
scrubber.tags = ['img']

html_fragment = Loofah.fragment('<a><img/ ></a>')
html_fragment.scrub!(scrubber)
html_fragment.to_s # => "<a></a>"

Rails 4.2可以在开箱即用的情况下实现这一点。对于旧版本,需要使用gem“rails html消毒器”

仅列出提供的标记和属性 或者使用丝瓜的目标洗涤器

Rails::Html::TargetScrubler

PermitScruber在清理中选择允许的标记和属性,Rails::Html::TargetScrubler将它们作为删除的目标

scrubber = Rails::Html::TargetScrubber.new
scrubber.tags = ['img']

html_fragment = Loofah.fragment('<a><img/ ></a>')
html_fragment.scrub!(scrubber)
html_fragment.to_s # => "<a></a>"

或者,使用从所有链接中删除颜色和文本下划线的打印CSS是否足够?或者,使用从所有链接中删除颜色和文本下划线的打印CSS是否足够?由于OP提到的元素是复数和黑名单,您可以执行:doc.search'a,script,例如,选择多个元素类型一次进行更改。用专业术语来说,虽然用标签内容替换标签的结果会很糟糕,但这是一个很好的选择。你是对的,这是一个糟糕的选择。我想不出PDF中可能不需要的另一个元素。我希望看到从PDF中删除:-由于OP提到了元素复数和黑名单,您可以执行以下操作:doc.search'a,script,…,例如,选择多个元素类型一次进行更改。很好的一点是,尽管使用专业术语替换标签的结果会令人讨厌。您是对的,这是一个糟糕的选择。我想不出PDF中可能不需要的另一个元素。我希望看到从PDF中删除:-请注意,Rails::Html::TargetScriber会按照OP的要求将元素替换为其内容,从而剥离该元素,您需要像这样定义一个自定义洗涤器:Loofah::Scriber.new do | node | node.remove if remove|u标记。include?node.name endNote Rails::Html::TargetScriber通过按照OP的要求将元素替换为其内容来去除该元素。如果您想要实际去除整个元素,您需要像这样定义一个自定义洗涤器:Loofah::scriber.new do | node | node.remove if remove_标记。include?node.name结束
html_without_links = remove_tags("<a href="link">Link!</a><b>Bold Text</b><div>A div!</div>",'a')
require 'nokogiri'

def is_html?(text)
  stripped_text = Nokogiri::HTML(text).text.strip
  return !stripped_text.eql?(text)
end

def remove_tags(message_string,tag=nil)
  return message_string if message_string.blank? || tag.blank? || !is_html?(message_string)
  html_doc = Nokogiri.HTML(message_string)
  html_doc.search(tag).each do |a|
    a.replace(a.content)
  end

  html_doc.text
end