【发布时间】: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
从一个表格元素中,我想选择所有具有类even 或类odd 的行。
我尝试了 jQuery 语法:
report.css("table.data tr[class~=odd even]").each{|line| parse_line_item(line)}
但它抛出了一个错误,感谢任何帮助,谢谢。
【问题讨论】:
标签: css ruby css-selectors nokogiri
您拥有的 CSS 选择器甚至没有语法上有效的选择器:
[class~=odd even]
必须始终引用包含空格的值,因此编写此选择器的正确方法是:
[class~="odd even"]
然而,这个选择器实际上永远无法匹配任何东西:[attr~=val] 属性值选择器匹配...
由于单词由空格分隔,这意味着它们本身不能包含空格。但是 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 可以是例如标题。
使用两个选择器: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 选择器那么简洁,但灵活得多。