防止Nokogiri对src属性进行url编码



因此,src属性在Nokogiri(或libxml2?)中似乎是神圣的:

> Nokogiri::HTML.fragment('<foo src="{{bar}}"></foo>').to_html
=> "<foo src="%7B%7Bbar%7D%7D"></foo>"

是否有任何方法可以避免URL编码此属性(至少对于自定义元素)?to_xml不是一个选项(我不能保证一个xhtml安全的环境)。

我认为你期望Nokogiri做一些它不应该做的事情。

<foo src="{{bar}}"></foo>

不是HTML,因为<foo>不是已知的HTML标记。另一方面,它可以是一个有效的XML标记。

看看Nokogiri对你的片段做了什么,这是它作为HTML的结果:

require 'nokogiri'
doc = Nokogiri::HTML.fragment('<a src="{{bar}}"></a>')
# => #(DocumentFragment:0x3fe6d6897ba8 {
#      name = "#document-fragment",
#      children = [
#        #(Element:0x3fe6d6897900 {
#          name = "a",
#          attributes = [
#            #(Attr:0x3fe6d68978d8 { name = "src", value = "{{bar}}" })]
#          })]
#      })
doc.to_s
# => "<a src="%7B%7Bbar%7D%7D"></a>"

如果它被正确处理为XML会发生什么:

doc = Nokogiri::XML.fragment('<a src="{{bar}}"></a>')
# => #(DocumentFragment:0x3fe6d68930d0 {
#      name = "#document-fragment",
#      children = [
#        #(Element:0x3fe6d6892eb4 {
#          name = "a",
#          attributes = [
#            #(Attr:0x3fe6d6892e8c { name = "src", value = "{{bar}}" })]
#          })]
#      })
doc.to_s
# => "<a src="{{bar}}"/>"
doc.to_xml
# => "<a src="{{bar}}"/>"
doc.to_html
# => "<a src="%7B%7Bbar%7D%7D"></a>"

Nokogiri有一组在解析HTML时使用的规则,但它基本上是在内部将HTML DOM转换为XML DOM,这在将其解析为HTML后查看文档检查时是可见的。转换是在文档输出期间发生的。您可以使用解析选项推动Nokogiri,并让它输出您想要的内容。

如果你觉得这是Nokogiri的不当行为,我强烈建议你在bug报告中向维护者提出。他们偶尔会来这里回答问题,但你会在Nokogiri谈话邮件列表或git中心页面上得到更快的回复。

如果你的标记不是有效的HTML,那么Nokogiri将尝试强制转换成某种有效的HTML。此时,您应该能够从中获得合理的XML、XHTML或HTML,这里的"合理"意味着它在语义上是有效的,只是可能不完全符合您的期望。

相关内容

  • 没有找到相关文章

最新更新