如何编写双条件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的逻辑:
//li[contains(@class, 'sport--block'):先筛选出所有class包含sport--block的<li>节点and contains(.//div/span, 'Теніс')]:同时满足该<li>下的某个div/span文本包含Теніс//*[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
相关产品推荐
相关产品推荐

