CSS селекторы: выберите элемент, где (родитель | дети) не совпадают X - PullRequest
0 голосов
/ 10 декабря 2010

Я бы хотел выбрать элемент, у которого нет дочерних элементов определенного типа, например:

всех <li> элементов, у которых нет <table class="someclass"> дочерних элементов, я хочу выбрать только родительский элемент, не дочерних элементов, которые не соответствуют таблице.

В аналогичной заметке я бы хотел сопоставить элементы, чьи родители не соответствуют X, например: все <li> элементы, которые не являются потомками <table class="someclass">.

Я использую python и lxml cssselect.

Спасибо!

Ответы [ 2 ]

1 голос
/ 11 декабря 2010

Селектор CSS3 :not поможет вам в этом.К сожалению, нет родительского селектора , поэтому вы не можете выбрать элемент на основе характеристик его дочерних элементов.

Для первого вопроса вы должны явно выполнить обход:

# All <li> elements who have no <table class="someclass"> children
[e.getparent() for e in CSSSelector('li > table:not(.someclass)')(html)]

# To make it unique if there could be multiple acceptable child tables
set(e.getparent() for e in CSSSelector('li > table:not(.someclass)')(html))

# If there could be empty <li>
set(itertools.chain(
    (e.getparent() for e in CSSSelector('li > table:not(.someclass)')(html)),
    CSSSelector('li:empty')(html)
))

Только CSS-селекторы могут ответить на ваш второй вопрос:

# All <li> elements who are not descendents of <table class="someclass">
CSSSelector(':not(table.someclass) li')(html)
0 голосов
/ 11 декабря 2010

Я не думаю, что CSS-селекторы имеют «что-либо, кроме» выбора, поэтому вы не можете сделать это таким образом.Может быть, вы можете сделать это с XPaths.которые более гибкие, но даже в этом случае вы получите очень сложные и тупые выражения пути.

Я бы порекомендовал вам просто получить все <li> элементы, просмотреть дочерние элементы каждого элемента и пропустить его, если один издети - это таблица.

Это будет легко понять и обслуживать, легко реализовать, и если ваши требования к производительности не слишком велики и вам не нужно обрабатывать десятки тысяч страниц в секунду, это будет достаточно быстро(тм).

Не усложняйте.

...