如何使用Selectolax选择无class属性的第1、2、3个span标签?
解决Selectolax选择无class属性的指定序号span标签问题
你的问题出在:nth-child()选择器的逻辑上——它是基于父元素下所有子元素的位置来匹配,而不是筛选后符合条件的元素的位置。
比如你写的span:not([class]):nth-child(1),它要求目标元素同时满足两个条件:
- 是父元素
<p class="card_street">下的第1个子元素 - 没有class属性
但父元素下的第1个<span>是带有card_street类的,所以这个选择器匹配不到任何元素。
两种可行的解决方法:
方法1:Python切片处理筛选结果(推荐)
既然tree.css('p.card_street span:not([class])')已经能获取到所有无class的span标签,直接用Python列表的切片或索引就能拿到指定序号的元素,这种方法不受HTML结构变化影响,更可靠:
from selectolax.parser import HTMLParser tree = HTMLParser( ''' <p class="card_street"> <span class="card_street">123 My Rd. </span> <span class="card_street">Suite 100</span> <span> Anywhere</span> <span>, TX</span> <span> 12345</span> </p> ''' ) # 获取所有无class的span all_target_spans = tree.css('p.card_street > span:not([class])') # 取第1个无class的span(索引从0开始) first_span = all_target_spans[0] print(first_span.text()) # 输出: Anywhere # 取前3个无class的span(这里刚好只有3个) first_three_spans = all_target_spans[:3] for span in first_three_spans: print(span.text())
运行结果:
Anywhere Anywhere , TX 12345
方法2:基于父元素下的绝对位置写CSS选择器
如果必须用纯CSS选择器,你可以根据无class的span在父元素中的绝对位置来写:
- 第1个无class的span是父元素下的第3个子元素
- 第2个是第4个
- 第3个是第5个
对应的选择器如下:
# 第1个无class的span tree.css('p.card_street > span:not([class]):nth-child(3)') # 第2个无class的span tree.css('p.card_street > span:not([class]):nth-child(4)') # 第3个无class的span tree.css('p.card_street > span:not([class]):nth-child(5)')
注意:这种方法依赖HTML结构的固定性,如果前面带class的span数量变化,选择器就会失效。
内容的提问来源于stack exchange,提问作者glenn15
相关产品推荐
相关产品推荐

