代码之家  ›  专栏  ›  技术社区  ›  oshirwani

无法使xpath适用于HTML代码块

  •  0
  • oshirwani  · 技术社区  · 2 周前

    我有这个html块:

    <td><a href="#" class="">   <i class="far fa-times mr-1"></i>Cancel</a></td>
    

    我写了下面的xpath来找到这个Cancel锚点,但这不起作用。我做错了什么?

    //a[contains(text(), 'Cancel')]
    

    下面的xpath是有效的,但我需要了解我在上面的xpath中做错了什么:

    //i[@class='far fa-times mr-1']/..
    
    1 回复  |  直到 2 周前
        1
  •  0
  •   Shawn    2 周前
    //a[contains(text(), 'Cancel')]
    

    问题 上面的XPath表达式不起作用的原因是,上面的XPath查找锚点( <a> )包含文本的元素 Cancel 。然而 <a> HTML片段中的元素不直接包含文本 取消 。相反,它包含 <i> 元素,然后是文本 取消 .

    解决方案 更改XPath表达式,如下所示:

    //a[contains(., 'Cancel')]
    

    XPath解释: 这个 . 表示当前节点,因此 contains(., 'Cancel') 检查中是否存在“取消”文本 <a> 元素及其所有后代。

        2
  •  0
  •   Siebe Jongebloed    2 周前

    问题是contains的第一个参数应该是单个字符串 a 有2个文本节点,则失败。第一个文本节点是仅空白的节点,第二个是内部带有“取消”的节点。

    我看到两种选择:

    1. //a[contains(., 'Cancel')] 这个 . 将所有派生文本节点组合为一个字符串。

    2. //a[contains(text()[normalize-space()], 'Cancel')] 这个 [normalize-space()] -谓词将只选择那些除了空白之外还有实际字符数据的文本节点。既然这只是一个问题,它就会成功。