如何初始化 Nokogiri::XML::Element

How to initialize a Nokogiri::XML::Element

我想使用以下方法初始化一个 Nokogiri::XML::Element 对象:

html = '<a href="https://example.com">Link</a>'
Nokogiri::XML::Element.new(html)

但目前我必须这样做:

Nokogiri::HTML::DocumentFragment.parse(html).children.last

有没有更好的方法?

您正在寻找 Nokogiri::HTML.fragment:

html = '<a href="https://example.com">Link</a>'
Nokogiri::HTML.fragment html
#=> #(DocumentFragment:0x2b296b79c0c4 { name = "#document-fragment", children = [ #(Element:0x2b296919d724 { name = "a", attributes = [ #(Attr:0x2b296919d6fc { name = "href", value = "https://example.com" })], children = [ #(Text "Link")] })] })
asd.children.last
#=> #(Element:0x2b296b7cbe50 { name = "a", attributes = [ #(Attr:0x2b296b7cbe28 { name = "href", value = "https://example.com" })], children = [ #(Text "Link")] })

Nokogiri 提供了 make 方法 (Nokogiri::make) 作为创建 DocumentFragment 的便捷方法,代码与您现在所做的几乎相同:

def make input = nil, opts = {}, &blk
  if input
    Nokogiri::HTML.fragment(input).children.first
  else
    Nokogiri(&blk)
  end
end

示例:

html = '<a href="https://example.com">Link</a>'
require 'nokogiri'
Nokogiri.make(html)
#=> #<Nokogiri::XML::Element:0x2afe5af3a04c name="a" attributes=
#    [#<Nokogiri::XML::Attr:0x2afe5ac33efc name="href" value="https://example.com">] 
#     children=[#<Nokogiri::XML::Text:0x2afe5ac32408 "Link">]>

其他选项包括

Nokogiri(html).first_element_child
Nokogiri.parse(html).first_element_child