Ruby Nokogiri-如何防止Nokogiri打印HTML字符实体



我有一个html,我正在使用Nokogiri解析它,然后从中生成一个html,就像这个一样

htext= File.open(input.html).read
h_doc = Nokogiri::HTML(htmltext)
/////Modifying h_doc//////////
File.open(output.html, 'w+')  do |file|
file.write(h_doc)
end

问题是如何防止NOkogiri在最终生成的HTML文件中打印HTML字符实体(< >, &  )

我想打印实际的字符(<,>等),而不是HTML字符实体(&lt; &gt; &amp; &nbsp;)

As an example it is printing the html like
 <title>&lt;%= ("/emailclient=sometext") %&gt;</title>
and I want it to output like this
<title><%= ("/emailclient=sometext")%></title>

所以。。。您希望Nokogiri输出不正确或无效的XML/HTML吗?

我的最佳建议是,事先用其他东西替换这些序列,用野村切下来,然后再替换回来。您的输入是而不是XML/HTML,期望Nokogiri知道如何正确处理它是没有意义的。因为外观:

<div>To write "&amp;", you need to write "&amp;amp;".</div>

此渲染:

To write "&", you need to write "&amp;".

如果你有办法的话,你会得到这个HTML:

<div>To write "&", you need to write "&amp;".</div>

将呈现为:

To write "&", you need to write "&".

更糟糕的是,在这种情况下,比如XHTML中:

<div>Use the &lt;script&gt; tag for JavaScript</div>

如果替换实体,则会得到不可播放的文件,因为<script>标记未关闭:

<div>Use the <script> tag for JavaScript</div>

EDIT我仍然认为你在试图让Nokogiri做一些它没有设计好做的事情:处理模板HTML。我宁愿假设你的文档通常不包含这些序列,并张贴更正:

doc.traverse do |node|
  if node.text?
    node.content = node.content.gsub(/^(s*)(S.+?)(s*)$/,
                                     "\1<%= \2 %>\3")
  end
end
puts doc.to_html.gsub('&lt;%=', '<%=').gsub('%&gt;', '%>')

您绝对可以阻止Nokogiri转换您的实体。它甚至是一个内置功能,不需要巫毒或黑客攻击。请注意,我不是nokogiri大师,只有当我直接在文档中的节点上操作时,我才能做到这一点,但我相信一点挖掘也可以向你展示如何使用独立节点。

创建或加载文档时,需要包含NOENT选项。就是这样。你完成了,你现在可以把实体添加到你的内心内容中。

需要注意的是,大约有六种方法可以通过选项调用文档,下面是我个人最喜欢的方法。

   require 'nokogiri'
   noko_doc = File.open('<my/doc/path>') { |f| Nokogiri.<XML_or_HTML>(f, &:noent)}
   xpath = '<selector_for_element>'
   noko_doc.at_<css_or_xpath>(xpath).set_attribute('I_can_now_safely_add_preformatted_entities!', '&amp;&amp;&amp;&amp;&amp;')
   puts noko_doc.at_xpath(xpath).attributes['I_can_now_safely_add_preformatted_entities!']
>>> &amp;&amp;&amp;&amp;&amp;

至于这个功能的有用性。。。我发现它非常有用。在很多情况下,你处理的是你无法控制的预格式化数据,而必须管理传入的实体,这样nokogiri才能让它们恢复原状,这将是一件非常痛苦的事情。

相关内容

  • 没有找到相关文章

最新更新