Nokogiri保持HTML实体不变

问题描述 投票:16回答:1

我希望Nokogiri保持HTML实体不变,但似乎正在将实体转换为实际符号。例如:

 Nokogiri::HTML.fragment('<p>&reg;</p>').to_s

结果:"<p>®</p>"

似乎没有任何东西可以将原始HTML还给我。.inner_html,.text和.content方法均返回'®'而不是'&reg;'

Nokogiri是否有办法使这些HTML实体保持不变?

我已经搜索了stackoverflow并发现了类似的问题,但没有一个完全像这个问题。

ruby nokogiri
1个回答
18
投票

不是理想的答案,但是您可以通过设置允许的编码来强制它生成实体(如果不是好的名称:)>

#encoding: UTF-8
require 'nokogiri'
html = Nokogiri::HTML.fragment('<p>&reg;</p>')
puts html.to_html                              #=> <p>®</p>
puts html.to_html( encoding:'US-ASCII' )       #=> <p>&#174;</p>

如果Nokogiri在定义的地方使用实体的“好”名称,而不是总是使用简洁的十六进制实体,那很好,但是即使那样也不会“保留”原始实体。

问题的根源在于,在HTML中,以下所有内容都描述了完全相同的内容:

<p>®</p>
<p>&reg;</p>
<p>&#xAE;</p>  
<p>&#174;</p>

如果您希望文本节点的to_s表示形式实际上是&reg;,则描述该标记的标记实际上就是:<p>&amp;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&reg;</p> 似乎不会导致创建一个:[]

Nokogiri::XML::ParseOptions::NOENT
© www.soinside.com 2019 - 2024. All rights reserved.