You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Selectolax选择无class属性的第1、2、3个span标签?

解决Selectolax选择无class属性的指定序号span标签问题

你的问题出在:nth-child()选择器的逻辑上——它是基于父元素下所有子元素的位置来匹配,而不是筛选后符合条件的元素的位置。

比如你写的span:not([class]):nth-child(1),它要求目标元素同时满足两个条件:

  1. 是父元素<p class="card_street">下的第1个子元素
  2. 没有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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 14:25:21