我希望Nokogiri保持HTML实体不变,但似乎正在将实体转换为实际符号。例如:
Nokogiri::HTML.fragment('<p>®</p>').to_s
结果:"<p>®</p>"
似乎没有任何东西可以将原始HTML还给我。.inner_html,.text和.content方法均返回'®'
而不是'®'
Nokogiri是否有办法使这些HTML实体保持不变?
我已经搜索了stackoverflow并发现了类似的问题,但没有一个完全像这个问题。
不是理想的答案,但是您可以通过设置允许的编码来强制它生成实体(如果不是好的名称:)>
#encoding: UTF-8 require 'nokogiri' html = Nokogiri::HTML.fragment('<p>®</p>') puts html.to_html #=> <p>®</p> puts html.to_html( encoding:'US-ASCII' ) #=> <p>®</p>
如果Nokogiri在定义的地方使用实体的“好”名称,而不是总是使用简洁的十六进制实体,那很好,但是即使那样也不会“保留”原始实体。
问题的根源在于,在HTML中,以下所有内容都描述了完全相同的内容:
<p>®</p> <p>®</p> <p>®</p> <p>®</p>
如果您希望文本节点的
to_s
表示形式实际上是®
,则描述该标记的标记实际上就是:<p>&reg;</p>
。
如果Nokogiri总是每个字符返回与输入文档时相同的编码,则它需要将每个字符存储为记录实体引用的自定义节点。存在一个可能用于此的类(Nokogiri::XML::EntityReference
):
Nokogiri::XML::EntityReference
但是,我找不到一种方法来使它们在使用Nokogiri v1.4.4或v1.5.0的解析过程中创建。具体来说,在解析过程中是否存在
require 'nokogiri' html = Nokogiri::HTML.fragment("<p>Foo</p>") html.at('p') << Nokogiri::XML::EntityReference.new( html.document, 'reg' ) puts html #=> <p>Foo®</p>
似乎不会导致创建一个:[]Nokogiri::XML::ParseOptions::NOENT