如何使用Nokogiri和Ruby为多个类选择

时间:2010-03-27 16:19:06

标签: css ruby css-selectors nokogiri

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

我尝试了jQuery语法:

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

但它引发了错误,感谢任何帮助,谢谢。

2 个答案:

答案 0 :(得分:10)

使用两个选择器: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 :(得分:2)

你所拥有的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选择器表达。您可以简单地使用选择器组,它们可以设置匹配的并集,这相当于使用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')

毕竟,是不是选择所有奇数和所有偶数行与选择所有行相同?我的意思是,你还有什么其他的,非理性的行?