从表元素中,我想选择具有类even
或类odd
的所有行。
我尝试了jQuery语法:
report.css("table.data tr[class~=odd even]").each{|line| parse_line_item(line)}
但它引发了错误,感谢任何帮助,谢谢。
答案 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]
属性值选择器匹配...
由于单词是由空格分隔的,这意味着它们本身不能包含空格。但是你这个词正在寻找("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')
毕竟,是不是选择所有奇数和所有偶数行与选择所有行相同?我的意思是,你还有什么其他的,非理性的行?