Найти детей первого уровня в nokogiri rails

Я столкнулся с проблемой, как найти детей первого уровня из текущего элемента? Например, у меня есть html:

 <table>
   <tr>abc</tr>
   <tr>def</tr>   
   <table>
     <tr>second</tr>
   </table>
 </table>

Я использую Nokogiri для рельсов:

table = page.css('table')
table.css('tr')

Он возвращает все tr внутри table. Но мне нужно только 2, что первый уровень для таблицы.

Ответ 1

Когда вы это скажете:

table = page.css('table')

вы захватываете обе таблицы, а не только таблицу верхнего уровня. Таким образом, вы можете вернуться к корню документа и использовать селектор, который соответствует только строкам в первой таблице, как говорит mosch, или вы можете исправить table только внешнюю таблицу с чем-то вроде этого:

table = page.css('table').first
trs   = table.xpath('./tr')

или даже это (в зависимости от реальной структуры HTML):

table = page.xpath('/html/body/table')
trs   = table.xpath('./tr')

или, возможно, один из них для table (спасибо Phrogz, еще раз):

table = page.at('table')
table = page.at_css('table')
# or various other CSS and XPath incantations

Ответ 2

Вы можете сделать

rows = page.css('body > table > tr')

Возможно, вам нужно адаптировать селектор к вашему элементу контейнера (я выбрал здесь "тело" )

Ответ 3

Как еще один способ, вы можете попытаться использовать что-то вроде этого:

text = <<HERE
  <table>
    <tr>abc</tr>
    <tr>def</tr>   
    <table>
      <tr>second</tr>
    </table>
  </table>
HERE
xml = Nokogiri::XML(text)
xml.xpath("/table/tr/").each do |node|
  puts node.text
end

В этом примере выражение '/table/tr' представляет собой абсолютный путь к требуемому элементу - 'tr' в нашем случае.