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

时间:2014-09-02 04:24:47

标签: ruby nokogiri

我有一个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字符实体(< > &  )我想打印实际字符(<,>等)。

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>

2 个答案:

答案 0 :(得分:1)

所以......你想让Nokogiri输出不正确或无效的XML / HTML吗?

我有最好的建议,事先用其他东西替换这些序列,用Nokogiri将其切掉,然后将它们更换回去。您的输入是而非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>

编辑我仍然认为您正试图让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;', '%>')

答案 1 :(得分:1)

你绝对可以阻止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可能会让它们恢复原状。