2014-09-02 42 views
0

我有一個HTML中我使用引入nokogiri解析,然後生成一個HTML出這像這樣紅寶石引入nokogiri - 如何防止引入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; &amp; &nbsp;)我想打印實際字符(<,>等)。

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> 

回答

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 "&". 

更糟糕的是,在這種情況下,比如在XHT ML:

<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;', '%>') 
+0

我想一定是有辦法做到這一點。原來的html的格式爲 sometext,我希望它被替換這樣<%sometext%>。但我越來越喜歡這個 <%; sometext%>。我認真地感覺必須有某種方式。 – user1788294 2014-09-02 06:34:14

+0

http://stackoverflow.com/questions/4476047/how-to-make-nokogiri-not-to-convert-nbsp-to-space。這與將我想做的事情做相反的談話聯繫起來。 – user1788294 2014-09-02 06:35:54

+0

只是爲了添加更多信息,我正在改變html變量文本,像這樣h_doc.traverse do | x | \t \t if x.text? \t \t \t \t \t \t \t \t \t \t \t x.content = 「<%」 + x.content + 「%>」 \t \t \t端 \t \t端 \t端 – user1788294 2014-09-02 06:40:34

1

你絕對可以阻止引入nokogiri從改變你的實體。它的內置功能,甚至沒有巫術或黑客需要。需要警告的是,我不是一個nokogiri guru,我只是在我直接在文檔內的一個節點上執行操作時纔有這個工作,但我確信有一點挖掘可以告訴你如何使用獨立節點太。

當您創建或加載文檔時,您需要包含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能夠恢復原來的狀態,管理傳入實體將是一件非常痛苦的事情。