Как выбрать несколько классов с использованием Nokogiri и Ruby - PullRequest
4 голосов
/ 27 марта 2010

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

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

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

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

Ответы [ 2 ]

10 голосов
/ 27 марта 2010

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

2 голосов
/ 27 марта 2010

Селектор CSS, который у вас есть, даже не имеет синтаксически допустимого селектора:

[class~=odd even]

Значения, содержащие пробелы, всегда должны заключаться в кавычки, поэтому правильный способ записи этого селектора будет:

[class~="odd even"]

Однако этот селектор на самом деле никогда ничего не может сопоставить: селектор значения атрибута [attr~=val] соответствует ...

элемент с атрибутом att, значение которого представляет собой список слов, разделенных пробелами, одно из которых точно равно "val". Если "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')

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

...