CSS选择器:选择元素,其中(parent | children)与X不匹配

时间:2010-12-10 18:52:10

标签: python css css-selectors lxml

我想选择一个没有特定类型子元素的元素,例如:

没有<li>个孩子的所有<table class="someclass">元素,我只想选择父元素,与表格不匹配的子元素。

在类似的说明中,我想匹配父母与X不匹配的元素,例如: 所有<li>元素都不是<table class="someclass">的后代。

我正在使用python和lxml的cssselect。

谢谢!

2 个答案:

答案 0 :(得分:1)

CSS3 :not selector会让你部分到达那里。不幸的是,there is no parent selector因此您无法根据其子项的特征选择元素。

对于你的第一个问题,你必须明确地进行遍历:

# 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)

答案 1 :(得分:0)

我不认为CSS选择器有“除了”之外的选择,所以你不能这样做。也许你可以用XPath做到这一点。它们更灵活,但即便如此,你也会得到非常复杂和钝的路径表达式。

我建议您只需获取所有<li>个元素,浏览每个元素,并在其中一个孩子是桌子时跳过它。

这将易于理解和维护,易于实现,除非您的性能要求非常极端,并且您需要每秒处理数万页,否则它将足够快(tm)。

保持简单。