在nokogiri轨道上找到一级儿童

问题描述 投票:0回答:5

我遇到了如何从当前元素中查找第一级子元素的问题? 例如我有 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 个第一层的桌子。

ruby nokogiri
5个回答
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

6
投票

你可以做

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

也许您必须使选择器适应您的容器元素(我在这里选择“body”)


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


0
投票

xpath 对我不起作用

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

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

0
投票

你愿意尝试这个吗?

tables = doc.css('table')

tables.each do |table|
  rows = table.css('tr')

  rows.each do |row|
    if row.parent == table
      # Some action here...
    end
  end
end
© www.soinside.com 2019 - 2024. All rights reserved.