Найти детей первого уровня в 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' в нашем случае.