Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XPath来查找子树_Xpath_Lxml - Fatal编程技术网

XPath来查找子树

XPath来查找子树,xpath,lxml,Xpath,Lxml,我正在抓取一个html文档,它的结构一直在变化。Css类名甚至会改变,所以我不能依赖它。但是,有一点永远不会改变,该值始终包含在子树中,如下所示: <span> <span> <span>wanted value</span> <span></span>wanted value </span> </span> 通缉价值 通缉价值 这可以表示为XPath表达式吗 它不应匹配

我正在抓取一个html文档,它的结构一直在变化。Css类名甚至会改变,所以我不能依赖它。但是,有一点永远不会改变,该值始终包含在子树中,如下所示:

<span>
  <span>
    <span>wanted value</span>
    <span></span>wanted value
  </span>
</span>

通缉价值
通缉价值
这可以表示为XPath表达式吗

它不应匹配:


1,太少了一个
2.
3,太多了
4,太多了两个

我计划使用lxml for Python来实现这一点

如果所需值的位置始终位于span的第三级,则可以使用xpath,如下所示:

//span/span/span[1]
应用于下一个HTML文档时:

<html>
  <head>
    <title>Your Title</title>
  </head>
  <body>
    <div>
    <span>
      <span>
        <span>wanted value</span>
        <span></span>
      </span>
    </span>
    </div>
    <div>
    <span>
      <span>
        <span>wanted value</span>
        <span></span>
      </span>
    </span>
    </div>
  </body>
</html>
编辑

如果第三级上的跨度总数等于2时,您只需要第三级上第一个跨度的值,则可以使用以下XPath:

//span/span[count(span) = 2]/span[1]

当有两个以上最里面的span元素时,您的表达式也会匹配,例如四个span同级元素,我希望它只在有两个span元素时匹配。@ThomasWessel:我不太明白您的意思。您是否可以展开/更改您的问题,或尝试使用HTML示例文档和所需输出进行解释?更新为counterexample@ThomasWessel当前位置我还是不明白。将XPath://span/span/span[1]应用于示例时,结果将是“1,太少了一个”。因此,将导致第三级中第一次出现span。这不是你想要的吗?您希望得到什么样的输出?这是一个巨大的文档,有几个地方有三个嵌套跨距。但我感兴趣的子树中只有一个子树在“底层”中有两个跨度元素。如果正好有两个,那么我对其中的第一个感兴趣。如果只有一个跨度元素,或者两个以上,那么我不想要任何跨度元素。
wanted value
wanted value
//span/span[count(span) = 2]/span[1]