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

Ruby Nokogiri-如何防止Nokogiri打印HTML字符实体,ruby,nokogiri,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,我正在使用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字符实体
(&;)

作为一个例子,它像
%=(“/emailclient=sometext”)%
我希望它像这样输出

所以。。。您想让Nokogiri输出不正确或无效的XML/HTML吗

我最好的建议是,事先用其他东西替换这些序列,用Nokogiri切碎,然后再替换回来。您的输入不是XML/HTML,没有必要指望Nokogiri知道如何正确处理它。因为你看:

<div>To write "&amp;", you need to write "&amp;amp;".</div>
如果您有自己的方式,您会得到以下HTML:

<div>To write "&", you need to write "&amp;".</div>
在这种情况下,更糟糕的是,比如在XHTML中:

<div>Use the &lt;script&gt; tag for JavaScript</div>
使用JavaScript的脚本标记
如果替换实体,由于未关闭的
标记,您将获得无法显示的文件:

<div>Use the <script> tag for JavaScript</div>
使用JavaScript的标记
编辑我仍然认为您试图让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;', '%>')
doc.traverse do |节点|
如果node.text?
node.content=node.content.gsub(/^(\s*)(\s.+?)(\s*)$/,
"\\1\\3")
结束
结束
将doc.to_html.gsub('%=','')

您完全可以阻止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”
noko|u doc=File.open(“”){f|Nokogiri.(f,&:noent)}
xpath=''
noko_doc.at_uu(xpath).set_属性(“我现在可以安全地添加预格式化的实体!”,“&;”)
将noko_doc.at_xpath(xpath).attributes['I_现在可以安全地添加预先格式化的实体!']
>>>&&&&&;

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

我认为一定有办法做到这一点。原始html的格式为sometext,我希望它能像这样被替换. 但我越来越像这样了<%;sometext%。我真的觉得一定有办法。这个链接讨论的是如何做与我想做的相反的事情。只是为了添加更多信息,我正在更改html变量文本,比如h_doc.traverse do | x | if x.text?x.content=“”结束
<div>Use the <script> tag for JavaScript</div>
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;', '%>')
   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;