我有一个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;等)。
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>
答案 0 :(得分:1)
所以......你想让Nokogiri输出不正确或无效的XML / HTML吗?
我有最好的建议,事先用其他东西替换这些序列,用Nokogiri将其切掉,然后将它们更换回去。您的输入是而非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>
编辑我仍然认为您正试图让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('%>', '%>')
答案 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!', '&&&&&')
puts noko_doc.at_xpath(xpath).attributes['I_can_now_safely_add_preformatted_entities!']
>>> &&&&&
至于这个功能的实用性......我发现它非常有用。在很多情况下,您正在处理您无法控制的预先格式化的数据,而且必须管理传入的实体才会非常痛苦,因此nokogiri可能会让它们恢复原状。