首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CSS选择器:选择不匹配X的元素

CSS选择器:选择不匹配X的元素
EN

Stack Overflow用户
提问于 2010-12-10 18:52:10
回答 2查看 2.1K关注 0票数 0

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

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

同样,我希望匹配父元素与X不匹配的元素,例如:所有不是<li>后代的<table class="someclass">元素。

我使用python和lxml的cssselect。

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2010-12-10 22:19:03

CSS3 :not selector会部分地把你带到那里。不幸的是,there is no parent selector使您无法根据其子元素的特性选择元素。

对于第一个问题,您必须显式地遍历:

代码语言:javascript
复制
# 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选择器才能处理第二个问题:

代码语言:javascript
复制
# All <li> elements who are not descendents of <table class="someclass">
CSSSelector(':not(table.someclass) li')(html)
票数 1
EN

Stack Overflow用户

发布于 2010-12-10 21:03:31

我不认为CSS选择器有“除了”选择,所以你不能这样做。也许你可以用XPaths来做。这更灵活,但即使这样,您也会得到非常复杂和迟钝的路径表达式。

我建议您只需获取所有的<li>元素,遍历每个元素子元素,如果其中一个子元素是表,则跳过它。

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

保持简单。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4412253

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档