Подтвердить что ты не робот

В Nokogiri, как мне найти все узлы, которые появляются до определенного node в моем документе?

Использование Rails 5, Ruby 2.4. Если я нашел node, используя синтаксический анализ Nokogiri, как бы найти все узлы, которые произошли до моего найденного node, который также не включает найденный node? То есть, скажем, мой документ

<outer>
    <p>Hello</p>
    <inner>
        <most_inner class="abc">Howdy</most_inner>
        <most_inner class="def">Next</most_inner>
    </inner>
</outer>

и я запускаю запрос типа

node = doc.search('//*[contains(@class, "def")]').first

Как бы я нашел все предыдущие узлы (которые не включают тот, который я только что идентифицировал)? Узлы, которые я ожидал бы, были бы

<p>Hello</p>
<most_inner>Howdy</most_inner>
4b9b3361

Ответ 1

Вам просто нужно перебирать узлы листа, пока не достигнете цели node.

# Node to exclude
node = doc.search('//*[contains(@class, "def")]').first
preceding_nodes = []

# Find all leaf nodes
leaf_nodes = doc.xpath("//*[not(child::*)]")

leaf_nodes.each do |leaf|
  if leaf == node
    break
  else
    preceding_nodes.push(leaf)
  end
end

preceding_nodes # => Contains all preceding leaf nodes