Селектор 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')
В конце концов, разве все четные и четные строки не совпадают с выбором всех строк? Я имею в виду, что еще у тебя там, иррациональные строки?