【问题标题】:How do I use the Nokogiri gem to select a div according to nested span class?如何使用 Nokogiri gem 根据嵌套跨度类选择 div?
【发布时间】:2014-03-03 16:53:43
【问题描述】:

我是 Ruby on Rails 的新手。我想在 Nokogiri 中使用 CSS 解析来选择 HTML 页面上的整个 div,而不是只选择嵌套元素。例如,如果我选择:

@sel = @page.css("div").select{|li| li['class']== "test" }
@sel_net = @sel.css("span").select{|li| li['class']== "test1" }

它将从 div 中选择 class 等于 test1 的所有跨度。但是,如果我想选择整个外部 div,它的跨度为 class,名为 test1,该怎么办?这可能吗?

【问题讨论】:

    标签: html css ruby-on-rails nokogiri


    【解决方案1】:

    如果我的理解正确,您的 HTML 看起来像这样:

    <div>
      This is the div we want.
      <span class="test1">Span contents</span> Other contents
    </div>
    <div>
      We don't want this div.
      <span class="something else">Not this</span> one
    </div>
    

    你想选择第一个div,而不是第二个。

    这在 CSS 中是不可能的(据我所知,Nokogiri 实现的任何 CSS 扩展都不可能),但可以使用 XPath 来完成。

    选择我们想要的div 的简单 XPath 查询可能如下所示:

    //div[span[@class = 'test1']]
    

    这可以理解为“所有具有span 元素的div 元素都是具有class 属性和值为test1 的直接子元素”。

    此查询仅测试class 属性是否与test1 直接匹配,因此如果类类似于“test1 otherclass”,则不会匹配。要让它像 CSS 一样工作,您需要将测试更改为:

    [contains(concat(' ', normalize-space(@class), ' '), ' test1 ')]
    

    此外,原始查询仅选择spans,它们是div 的直接子代。如果您在要匹配的其他元素中有span,则需要在查询中使用descendant 轴。

    把它们放在一起:

    //div[descendant::span[contains(concat(' ', normalize-space(@class), ' '), ' test1 ')]]
    

    可以理解为“所有div 元素在test1 类中的span 后代(在CSS 意义上)”。

    显然要使用它,您需要使用 xpath method 而不是 css 方法:

    divs = @page.xpath("//div[descendant::span[contains(concat(' ', normalize-space(@class), ' '), ' test1 ')]]")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-28
      • 2019-02-28
      • 2016-11-06
      • 2011-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-04
      相关资源
      最近更新 更多