代码之家  ›  专栏  ›  技术社区  ›  Russ Bradberry

如何选择使用nokogiri和ruby的多个类

  •  4
  • Russ Bradberry  · 技术社区  · 15 年前

    从table元素中,我要选择具有该类的所有行 even 或班 odd .

    我尝试了jquery语法:

    report.css("table.data tr[class~=odd even]").each{|line| parse_line_item(line)}
    

    但它抛出了一个错误,任何帮助都是感激的,谢谢。

    2 回复  |  直到 15 年前
        1
  •  10
  •   Ron DeVera    15 年前

    使用两个选择器: report.css("table.data tr.odd, table.data tr.even")

    这个 ~= CSS属性选择器中的运算符检查该值是否与以空格分隔的类列表匹配。例如, tr[class~=odd] 将匹配 <tr class="odd"> <tr class="odd ball"> . 但是,在特定情况下 class 属性,更好的选择器是 tr.odd .

    如果您使用 ~= 值中有空格的运算符(如 tr[class~="odd even"] ,选择器将永远不匹配任何内容。

        2
  •  2
  •   Jörg W Mittag    15 年前

    您拥有的CSS选择器甚至没有语法上有效的选择器:

    [class~=odd even]
    

    必须始终引用包含空白的值,因此写入此选择器的正确方法是:

    [class~="odd even"]
    

    但是,此选择器实际上无法匹配任何内容: [attr~=val] 属性值选择器匹配…

    an element with the att attribute whose value is a whitespace-separated list of words, one of which is exactly "val" . If "val" contains whitespace, it will never represent anything (since the words are separated by spaces)

    因为单词是由空格分隔的,这意味着它们不能包含空格本身。但是这个词 正在寻找( "odd even" ) 包含空白,因此它不能匹配任何内容。

    大概,你要找的是 OR 组合器,但它不存在。因此,您要查找的内容不能用CSS选择器来表示。

    事实上,这不是真的 可以 用CSS选择器表示。您可以简单地使用选择器组,它为您设置匹配的联合,这相当于使用 组合器:

    table.data tr.odd, table.data tr.even
    

    记住:CSS是基于设置的,因此顺序无关紧要。在你的情况下,命令 重要的是,这意味着CSS确实是该工作的错误工具:

    report.xpath('//table[@class="data"]//tr[@class="odd" or @class="even"')
    

    尽管我必须承认,我不知道你为什么不使用这样的东西:

    report.css('table.data tr')
    

    毕竟,选择所有奇数行和所有偶数行与选择 全部的 排?我的意思是,你还有什么,不合理的争吵?