找到nokogiri铁轨的第一级儿童

时间:2011-10-27 18:35:13

标签: ruby nokogiri

我遇到过如何从当前元素中找到第一级孩子的问题? 例如我有html:

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

我正在使用Nokogiri作为rails:

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

它会返回tr内的所有table。 但我只需要2个表格的第一级。

4 个答案:

答案 0 :(得分:22)

当你这样说时:

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

答案 1 :(得分:5)

你可以做到

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

也许你必须让选择器适应你的容器元素(我在这里选择'body')

答案 2 :(得分:1)

另一方面,您可以尝试使用以下内容:

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'。

答案 3 :(得分:0)

xpath did not work for me

下面的代码对我来说很好。

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