Ruby Nokogiri-如何防止Nokogiri打印HTML字符实体
我有一个html,我正在使用Nokogiri解析它,然后像这样生成一个htmlRuby 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字符实体(,&;) 我
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 "&", you need to write "&amp;".</div>
如果您有自己的方式,您会得到以下HTML:
<div>To write "&", you need to write "&".</div>
在这种情况下,更糟糕的是,比如在XHTML中:
<div>Use the <script> 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('<%=', '<%=').gsub('%>', '%>')
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!', '&&&&&')
puts noko_doc.at_xpath(xpath).attributes['I_can_now_safely_add_preformatted_entities!']
>>> &&&&&
需要“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('<%=', '<%=').gsub('%>', '%>')
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!']
>>> &&&&&