Как инициализировать Nokogiri :: XML :: Element - PullRequest
0 голосов
/ 26 июня 2019

Я хотел бы инициализировать Nokogiri::XML::Element объект, используя:

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

Но в настоящее время я должен сделать это:

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

Есть ли лучший способ?

Ответы [ 2 ]

4 голосов
/ 26 июня 2019

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
0 голосов
/ 26 июня 2019

Вы ищете 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")] })
...