【问题标题】:find first level children in nokogiri rails在 nokogiri rails 中找到一级儿童
【发布时间】:2011-12-16 18:21:07
【问题描述】:

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

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

我正在使用 Nokogiri 进行滑轨:

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

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

【问题讨论】:

    标签: ruby nokogiri


    【解决方案1】:

    你可以的

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

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

    【讨论】:

    • 不,因为在这种情况下,您还选择了嵌套在内表中的 tr 元素
    • 你也可以通过table.css('&gt; tr')获取表的直接后代
    【解决方案2】:

    作为另一种方式,您可以尝试使用这样的东西:

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

    【讨论】:

    • 因为这是 html,所以你真的想使用 Nokogiri::HTML。您的 xpath 中的尾部斜杠也会破坏它。
    • 糟糕,这是我的几个错别字 - 你完全正确,我很抱歉 :)
    【解决方案3】:

    当你这样说时:

    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
    

    【讨论】:

    • 您可能想要提及page.at('table')page.at_css('table') 而不是page.css('table').first
    • @Phrogz:谢谢,我也加入了这些。
    • 冒着走得太远的风险:page.xpath('//table[not(ancestor::*[1][name()="table"])]')跨度>
    • @pguardiario:我一直在等待这样的事情发生,我只是不想为此负责:) 你可以把它作为答案扔掉(在添加尾随 /tr , page.xpath('//table[not(ancestor::*[1][name()="table"])]/tr')),一点 XPath 永远不会伤害任何人。
    【解决方案4】:

    xpath did not work for me

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

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

    【讨论】:

      猜你喜欢
      • 2013-09-19
      • 1970-01-01
      • 2020-04-17
      • 1970-01-01
      • 1970-01-01
      • 2019-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多