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

如何编写双条件XPath,获取指定节点下event--line--position的span值?

搞定你的XPath多条件查询需求

嘿,没问题!你完全可以通过单个XPath查询直接定位到目标元素,然后一次性提取所需的span值存入列表,不需要额外循环每个<li>节点再去查找子元素(当然如果你需要处理更多<li>内的其他信息,循环处理也是可行的选项)。

直接用XPath定位目标span的方案

先修正一下你原来的XPath路径(原来的路径少了根节点的//,而且最好明确指定<li>的class来缩小范围),然后把两个条件整合到一个XPath里,直接定位到符合要求的<li>下的event--line--position内的span:

//li[contains(@class, 'sport--block') and contains(.//div/span, 'Теніс')]//*[contains(@class, 'event--line--position')]/span

解释一下这个XPath的逻辑:

  1. //li[contains(@class, 'sport--block'):先筛选出所有class包含sport--block的<li>节点
  2. and contains(.//div/span, 'Теніс')]:同时满足该<li>下的某个div/span文本包含Теніс
  3. //*[contains(@class, 'event--line--position')]/span:在符合条件的<li>下,找到class包含event--line--position的节点,再选中它下面的<span>

对应的代码实现(以Selenium C#为例)

你可以用FindElements(复数形式)一次性获取所有目标span元素,然后提取文本存入列表:

// 一次性获取所有符合条件的span元素
var targetSpanElements = driver.FindElements(By.XPath("//li[contains(@class, 'sport--block') and contains(.//div/span, 'Теніс')]//*[contains(@class, 'event--line--position')]/span"));

// 将span的文本提取到列表中
List<string> spanValuesList = targetSpanElements.Select(elem => elem.Text).ToList();

备选:循环处理<li>节点的方案

如果你还需要对每个<li>节点做其他操作(比如提取更多信息),也可以先定位所有符合条件的<li>,再循环查找每个<li>下的目标span:

// 先获取所有符合条件的sport--block节点
var sportBlockElements = driver.FindElements(By.XPath("//li[contains(@class, 'sport--block') and contains(.//div/span, 'Теніс')]"));

List<string> spanValuesList = new List<string>();

foreach (var block in sportBlockElements)
{
    // 在当前li下查找目标span(注意XPath开头的`.`,表示在当前节点下搜索)
    var positionSpan = block.FindElement(By.XPath(".//*[contains(@class, 'event--line--position')]/span"));
    spanValuesList.Add(positionSpan.Text);
}

两种方案都能实现你的需求,如果你只需要span的文本,第一种单XPath的方式会更简洁高效;如果要处理更多节点信息,循环的方式灵活性更强。

内容的提问来源于stack exchange,提问作者The Vee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:47:12