2010-12-10 7 views
0

Ich möchte ein Element auszuwählen, die keine Kinder eines bestimmten Typs hat, zum Beispiel:CSS-Selektoren: select-Element, wo (parent | Kinder) nicht übereinstimmen X

alle <li> Elemente, die keine <table class="someclass"> haben Kinder, ich möchte nur das Elternelement, nicht die Kinder, die Tabelle nicht übereinstimmen auswählen.

Auf eine ähnliche Notiz, ich möchte Elemente, deren Eltern entsprechen X nicht übereinstimmen, zum Beispiel: alle <li> Elemente, die nicht Abkömmlinge <table class="someclass"> sind.

Ich benutze Python und lxml's Cssselect.

Danke!

+2

ich weder Ihre Bedingungen denken kann mit dem Standard erfüllt werden CSS-Selektoren. – Gumbo

Antwort

0

Ich glaube nicht, CSS-Selektoren haben "alles andere als" Auswahl, so dass Sie es nicht so machen können. Vielleicht kannst du es mit XPaths machen. welche sind flexibler, aber selbst dann werden Sie sehr komplexe und stumpfe Pfadausdrücke bekommen.

Ich würde empfehlen, dass Sie einfach alle <li> Elemente erhalten, gehen Sie durch jeden elemnts Kinder, und überspringen Sie es, wenn eines der Kinder ein Tisch ist.

Dies wird leicht verständlich und wartbar, einfach zu implementieren sein, und wenn Ihre Leistungsanforderungen wirklich extrem sind und Sie Zehntausende Seiten pro Sekunde verarbeiten müssen, wird es Fast Genug (tm) sein.

Halten Sie es einfach.

1

Die CSS3 :not selector wird Sie teilweise dort bekommen. Leider there is no parent selector, so dass Sie kein Element basierend auf den Eigenschaften seiner untergeordneten Elemente auswählen können.

Für Ihre erste Frage haben Sie explizit die Traversal zu tun:

# 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-Selektoren allein können Ihre zweite Frage behandeln:

# All <li> elements who are not descendents of <table class="someclass"> 
CSSSelector(':not(table.someclass) li')(html) 
Verwandte Themen