删除Ruby中的特定HTML元素
我在Ruby中见过基于白名单的HTML清理程序,但我需要的是相反的,我只需要从页面中删除链接就可以进行PDF转换。我尝试了清理,但它不符合我的需要,因为很难猜测在获取的页面上将使用哪些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<
<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