我有一个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><%= ("/emailclient=sometext") %></title>
and I want it to output like this
<title><%= ("/emailclient=sometext")%></title>
所以。。。您希望Nokogiri输出不正确或无效的XML/HTML吗?
我的最佳建议是,事先用其他东西替换这些序列,用野村切下来,然后再替换回来。您的输入是而不是XML/HTML,期望Nokogiri知道如何正确处理它是没有意义的。因为外观:
<div>To write "&", you need to write "&amp;".</div>
此渲染:
To write "&", you need to write "&".
如果你有办法的话,你会得到这个HTML:
<div>To write "&", you need to write "&".</div>
将呈现为:
To write "&", you need to write "&".
更糟糕的是,在这种情况下,比如XHTML中:
<div>Use the <script> 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('<%=', '<%=').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!', '&&&&&')
puts noko_doc.at_xpath(xpath).attributes['I_can_now_safely_add_preformatted_entities!']
>>> &&&&&
至于这个功能的有用性。。。我发现它非常有用。在很多情况下,你处理的是你无法控制的预格式化数据,而必须管理传入的实体,这样nokogiri才能让它们恢复原状,这将是一件非常痛苦的事情。