【问题标题】:How Do I Select for Multiple Classes Using Nokogiri and Ruby如何使用 Nokogiri 和 Ruby 选择多个类
【发布时间】:2011-02-01 13:34:51
【问题描述】:

从一个表格元素中,我想选择所有具有类even 或类odd 的行。

我尝试了 jQuery 语法:

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

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

【问题讨论】:

    标签: css ruby css-selectors nokogiri


    【解决方案1】:

    您拥有的 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)

    由于单词由空格分隔,这意味着它们本身不能包含空格。但是 you 正在寻找的词 ("odd even"),确实包含空格,因此它永远无法匹配任何内容。

    大概,您正在寻找的是一个 OR 组合器,但它不存在。所以,你要找的东西不能用 CSS 选择器来表达。

    嗯,实际上,这不是真的:它可以用 CSS 选择器来表达。您可以简单地使用选择器组,它为您提供匹配的集合并集,相当于使用OR 组合器:

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

    毕竟,选择所有奇数行和所有偶数行与选择所有行不一样吗?我的意思是,你还有什么,不合理的行?

    【讨论】:

    • tr 可以是例如标题。
    【解决方案2】:

    使用两个选择器: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"],则选择器将永远不会匹配任何内容。

    【讨论】:

    • 这行得通,但是它以1,3,5,7,9,2,4,6,8 的形式提供给我,而不是按顺序提供。有没有办法按顺序获取?
    • 如果顺序很重要,您可以选择table.data tr[class] 以查找具有任何class 属性的每个tr,然后在Ruby 中检查准确的class 值。它不像 CSS 选择器那么简洁,但灵活得多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-05
    • 2012-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多