gpt4 book ai didi

ruby - Nokogiri 保持 HTML 实体不变

转载 作者:数据小太阳 更新时间:2023-10-29 06:35:46 25 4
gpt4 key购买 nike

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

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

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

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

有没有办法让 Nokogiri 保持这些 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> .

如果 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 "Foo\u00AE">
#=> #<Nokogiri::XML::Text:0x810cc624 "Foo\u00AE">
#=> #<Nokogiri::XML::Text:0x810cc228 "Foo\u00AE">
#=> #<Nokogiri::XML::Text:0x810cbe04 "Foo\u00AE">

关于ruby - Nokogiri 保持 HTML 实体不变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7756123/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com