2010-12-10 4 views
0

내가 특정 유형의 아이가없는 요소를 선택하고 싶습니다 일치하지 않는 : 더 <table class="someclass">이없는CSS 셀렉터 (부모 | 아이들) 선택 요소, 예를 들어, X

모든 <li> 요소를 하위 요소 인 이 아닌 테이블과 일치하지 않는 하위 요소 만 선택하고 싶습니다. 비슷한 노트에

, 나는 예를 들어, 부모 X 일치하지 않는 요소와 일치하고 싶습니다 : <table class="someclass">의 후손하지 모든 <li> 요소를.

저는 파이썬과 lxml의 cssselect를 사용하고 있습니다.

감사합니다.

+2

:

# 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 선택기 혼자 두 번째 질문을 처리 할 수 ​​있습니다 : 첫 번째 질문에 대한

명시 적으로 탐색 할 필요가 CSS 선택자. – Gumbo

답변

0

CSS 선택기에 "아무것도 선택하지 않았습니다"라고 생각하지 않으므로 그렇게 할 수 없습니다. 어쩌면 XPath로 할 수 있습니다. 더 유연하지만 더 복잡하고 둔한 경로 표현을 얻을 수 있습니다.

모든 <li> 엘리먼트를 가져와 각 엘리먼트의 하위 엘리먼트를 살펴보고 하위 엘리먼트 중 하나가 테이블 인 경우 건너 뛰는 것이 좋습니다.

이것은 쉽게 이해하고 유지 보수가 용이하며 구현하기 쉽고 성능 요구 사항이 극단적이고 초당 수십만 페이지를 처리해야하는 경우가 아니라면 Fast Enough (tm)가됩니다.

간단하게 유지하십시오.

1

CSS3 :not selector 부분적으로 나타납니다. 불행하게도 there is no parent selector이므로 하위 요소의 특성을 기반으로 요소를 선택할 수 없습니다. 표준에 충족 될 수 난 당신의 조건 중 어느 것도 생각

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