加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – Nokogiri将HTML实体保持原样

发布时间:2020-12-16 20:46:13 所属栏目:百科 来源:网络整理
导读:我希望Nokogiri将HTML实体保持原样,但似乎将实体转换为实际符号.例如: Nokogiri::HTML.fragment('preg;/p').to_s 结果为:“ p? / p” 没有什么似乎返回原来的HTML回到我. .inner_html,.text,.content方法都返回’?’而不是’ reg’ 有没有办法让诺基里离开
我希望Nokogiri将HTML实体保持原样,但似乎将实体转换为实际符号.例如:
Nokogiri::HTML.fragment('<p>&reg;</p>').to_s

结果为:“< p>?< / p>”

没有什么似乎返回原来的HTML回到我.
.inner_html,.text,.content方法都返回’?’而不是’& reg’

有没有办法让诺基里离开这些HTML实体?

我已经搜索到stackoverflow,并发现类似的问题,但没有完全像这样.

谢谢.

解决方法

不是一个理想的答案,但您可以强制它通过设置允许的编码来生成实体(如果不是很好的名称):
#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&gt ;. 如果Nokogiri总是返回与用于输入文档的每个字符相同的编码,则需要将每个字符存储为记录实体引用的自定义节点.存在可能用于此类的类(Nokogiri::XML::EntityReference):

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 v1.4.4或v1.5.0进行解析时,我找不到一种方法来创建它们.具体来说,解析期间Nokogiri::XML::ParseOptions::NOENT的存在或不存在似乎不会导致创建一个:

require 'nokogiri'
html = "<p>Foo&reg;</p>"
[ Nokogiri::XML::ParSEOptions::NOENT,Nokogiri::XML::ParSEOptions::DEFAULT_HTML,Nokogiri::XML::ParSEOptions::DEFAULT_XML,Nokogiri::XML::ParSEOptions::STRICT
].each do |parse_option|
  p Nokogiri::HTML(html,nil,'utf-8',parse_option).at('//text()')
end
#=> #<Nokogiri::XML::Text:0x810cca48 "Foou00AE">
#=> #<Nokogiri::XML::Text:0x810cc624 "Foou00AE">
#=> #<Nokogiri::XML::Text:0x810cc228 "Foou00AE">
#=> #<Nokogiri::XML::Text:0x810cbe04 "Foou00AE">

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读