найти детей первого уровня в рельсах нокогири - PullRequest
13 голосов
/ 27 октября 2011

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

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

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

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

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

Ответы [ 4 ]

22 голосов
/ 27 октября 2011

Когда вы говорите это:

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
5 голосов
/ 27 октября 2011

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

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

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

1 голос
/ 27 октября 2011

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

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' внаш случай.

0 голосов
/ 21 августа 2018

xpath у меня не работал

Приведенный ниже код отлично сработал.

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