Ваш XPath не подходит, если вы не знаете, что ваш узел sub
находится на верхнем уровне. Подумайте о селекторах XPath как о путях в ОС. /sub
будет в корне диска.
Я бы рекомендовал использовать CSS селекторы для ясности:
require 'nokogiri'
doc = Nokogiri::HTML(<<EOT)
<main>
<sub>
<inner>
<first>first_text</first>
<second></second>
</inner>
</sub>
</main>
EOT
doc.at('sub first').text # => "first_text"
'sub first'
означает, что first
должен существовать где-то под 'sub'
.
Это может помочь:
require 'nokogiri'
doc = Nokogiri::HTML(<<EOT)
<main>
<sub>
<inner>
<first>first_text</first>
<second></second>
</inner>
</sub>
</main>
EOT
doc.at('/sub/first') # => nil
doc.at('sub first') # => #<Nokogiri::XML::Element:0x3fd580c9e54c name="first" children=[#<Nokogiri::XML::Text:0x3fd580c9e2f4 "first_text">]>
doc.at('//sub/*/first') # => #<Nokogiri::XML::Element:0x3fd580c9e54c name="first" children=[#<Nokogiri::XML::Text:0x3fd580c9e2f4 "first_text">]>
doc.at('//sub//first') # => #<Nokogiri::XML::Element:0x3fd580c9e54c name="first" children=[#<Nokogiri::XML::Text:0x3fd580c9e2f4 "first_text">]>
doc.at('sub first').text # => "first_text"
doc.at('//sub/*/first').text # => "first_text"
doc.at('//sub//first').text # => "first_text"
Как насчет XPath 'югу // first'? , который будет проверять/возвращать узел 'first' в' sub' независимо от того, насколько глубокий «первый» является вложенным – har07