C#htmlagilitypack XPath帮助

C#htmlagilitypack XPath帮助,c#,xpath,html-agility-pack,C#,Xpath,Html Agility Pack,我有一个xpath表达式不起作用 "//div[child[0]::h4[text()[contains(.,'Dir')]]]/a" 要分析此html,请执行以下操作: <div class="txt"> <h4 class="c1"> Dir </h4> <a href="/name/myname/">Bob</a> </div> 迪尔 我正在尝试获取链接

我有一个xpath表达式不起作用

"//div[child[0]::h4[text()[contains(.,'Dir')]]]/a"
要分析此html,请执行以下操作:

<div class="txt"> 
      <h4 class="c1"> 
        Dir
      </h4> 
    <a  href="/name/myname/">Bob</a>
</div> 

迪尔

我正在尝试获取链接节点(a)。文档中还有其他具有相同div/h4层次结构的html标记,唯一的区别是h4标记的innertext。那么,我如何检查div类(1)是否有一个子h4节点,其中包含内部文本“dir”,以及(2)如何获取第一个链接节点(a)。不要假设该链接是h4的下一个同级链接。

难道不能使用这个xpath吗

"//div[h4[contains(text(),'Dir')]]/a"
子[0]
不是有效的axis AFAIK,因此它会失败

我不知道如果没有看到更完整的HTML示例,仅此一项是否就能满足您的条件。但这对这一个肯定有效

如果在
div
中可能有多个
h4
元素,并且您只想检查第一个:

"//div[h4[1][contains(text(),'Dir')]]/a"
如何检查div类(1)是否有内部文本为“dir”的子h4节点,以及(2)如何获取第一个链接节点(a)

使用:


同意,除非您可能不需要在
h4
之后使用
[1]
。还是你从OP的
子[0]::h4
?@LarsH推断出你的观察在逻辑上是一致的
h4
就足够了,因为我们将其作为条件使用。OP要求使用sub h4,但不是第一个。您非常接近,只是无法将谓词放在轴上,因此
child[0]:
不正确。如果您想要
div
的第一个子元素
h4
,可以使用
//div[child::h4[1][text()[…]]/a
,或者只使用
//div[h4[1][text()[…]/a
,因为
子元素:
是隐式的。如果
h4
必须是第一个子元素,那么
//div h4[*[1]/self h4[…]/a
。注意:我假设您将在这些XPath中使用
SelectSingleNode()
方法。因此,如果有多个
a
元素,这将已经使用了第一个元素(根据需要)。
"//div[@class='txt' and h4[contains(.,'Dir')]]/a[1]"