我想选择一个没有特定类型子元素的元素,例如:
没有<li>
个孩子的所有<table class="someclass">
元素,我只想选择父元素,不与表格不匹配的子元素。
在类似的说明中,我想匹配父母与X不匹配的元素,例如:
所有<li>
元素都不是<table class="someclass">
的后代。
我正在使用python和lxml的cssselect。
谢谢!
答案 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)。
保持简单。