2010-03-27 5 views
4

Из элемента таблицы я хотел бы выбрать все строки, которые имеют класс even или класс odd.Как выбрать для нескольких классов с помощью Nokogiri и Ruby

Я попробовал синтаксис JQuery:

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

но бросил ошибку, любая помощь приветствуется, спасибо.

ответ

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"], селектор никогда не будет ничего соответствовать

+0

это работает, однако оно дает мне как «1,3,5,7,9,2,4,6,8', а не последовательно. есть ли способ получить его последовательно? –

+0

Если порядок имеет значение, вы можете выбрать 'table.data tr [class]', чтобы найти каждый 'tr' с любым атрибутом' class', а затем проверить точное значение 'class' в Ruby. Это не так лаконично, но гораздо более гибко, чем селектор CSS. –

+0

плохо смотри в это, спасибо! –

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 действительно неправильный инструмент для работы:

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

Хотя я должен признать, что я не знаю, почему вы не просто использовать что-то вроде этого:

report.css('table.data tr') 

в конце концов, не выбирая все нечетный и все четные строки так же, как выбор всех строк? Я имею в виду, что еще вы получили там, иррациональные строки?

+0

'tr' может быть заголовком, например. –