Html (反向)遍历XPath查询以访问具有特定文本值的DIV

Html (反向)遍历XPath查询以访问具有特定文本值的DIV,html,xpath,Html,Xpath,使用一个DOM,这个DOM有100多次类似于这样的HTML循环 <div class="intro"> <div class="header"> <h1 class="product-code"> <span class="code">ZY001</span> <span class="intro">ZY001 Title/Intro</span> </h1> </div

使用一个
DOM
,这个DOM有100多次类似于这样的HTML循环

<div class="intro"> 
  <div class="header"> 
     <h1 class="product-code"> <span class="code">ZY001</span> <span class="intro">ZY001 Title/Intro</span> </h1> 
  </div> 
<div> 
<table> 
<tbody>
   <tr> 
        <td>Available</td>
        <td> S </td>
        <td> M </td>
        <td> XL </td>
  </tr> 
对象(域节点列表)[595] 公共“长度”=>int 591

现在,我需要专门针对
产品代码
/
代码
,以检索特定
代码的所有
td
属性

因为包含唯一标识符的div(在上面的示例中,
ZY001
)不是直接的祖先,所以我的想法是必须执行反向XPath查询

以下是我的一个尝试:

//h1[@class='product-code']/span[contains(@class, 'code') and text() = 'ZY001']/../../div[@class='intro']/div/table/tbody/tr/td[contains(text(),'Available')]/following-sibling::td
当我定义
/span[contains(@class,'code')和text()='ZY001']
并尝试使用
/../../../
向后遍历dom两次时,我希望/期望返回div[@class='intro'],其上的文本
ZY001
,或者更确切地说是
public'length'=>int 1

但到目前为止,我所有的尝试都得到了
0
结果。不是
false
,表示XPath不正确,而是
0

如何修改XPath查询,以在包含
/
文本值
ZY001
的多个
中的一个中获取单个实例?

使用

//h1[@class='product-code']/span[contains(@class, 'code') and text() = 'ZY001']/../../../div/table/tbody
而不是

//h1[@class='product-code']/span[contains(@class, 'code') and text() = 'ZY001']/../../div[@class='intro']/div/table/tbody

为此,您可以使用以下任何xpath:

//div[@class='intro' and //h1[@class='product-code']/span[@class='code' and text()='ZY001']]//tbody/tr[td[text()='Available']]/td[2]

//div[@class='intro' and //span[@class='code' and text()='ZY001']]//tbody/tr[td[text()='Available']]/td[2]

//div[@class='intro' and //span[@class='code' and text()='ZY001']]//tr[td[text()='Available']]/td[2]

td[2]
更改为
td[3]
td[4]
分别获取第3个和第4个
td
,您希望获取代码us ZY001和第1个可用的元素,对吗?对。我的困难是它不是直系后裔。看看我的答案。如果需要,可以解释更多。谢谢。我一回到家就会尝试一下(现在正在工作,没有代码)是的,这正是我想要的,非常感谢!更具体地说,
//h1[@class='product-code']/span[contains(@class='code')和text()='ZY001']/../../../../../../../div/table/tbody/tr/td[contains(text(),'Available')]/following sibling::td
感谢各种可能性,它们很有趣。对它们不利的一点是,它们的处理速度似乎都比@StevenLiang XPath查询慢得多。不过它们是不同的,明天我将对它们进行更多的测试,并选择一个答案。我实际上对它有点好奇,但它似乎进展如此缓慢的原因是它得到了所有节点(在99%的迭代中…-仍然想像我说的那样测试它,以了解我在做什么。),这意味着
td[2]
带来了100(这是循环的每次迭代),这意味着查询不是唯一标识符/
ZY001
)所独有的。。明天将再次查看,但我在您下面的答案中的编辑作为参考,除了带回
NULL
而不是
可用
(如果像你一样把
nodeValue
中的所有
td
都带回来-这并不特别重要,只是引用。是的,这也让我想到了,我从来没有像对待xpath那样看待它会更快,我过去总是把它看作是最有可能不会改变的东西。我也会做一些研究。谢谢你提到这一点,这是非常重要的。)太让我心碎了男人:P..所以是的,对于
div
class
intro
封装,查询忽略了
text()='whatever'
,或者换句话说
//div[@class='intro'和//h1[@class='code'和text()='ZY001']//tbody/tr[td[text()='Available']
返回与此查询完全相同的XPath结果
。为什么会这样,我不确定。不过这是一个有趣的策略,让我从其他方面思考。至于答案,我必须同意@StevenLiang的回答,因为它正在处理
文本()
path返回相关td的per..,并根据我的应用程序的需要工作。再次感谢您的尝试:)
//div[@class='intro' and //h1[@class='product-code']/span[@class='code' and text()='ZY001']]//tbody/tr[td[text()='Available']]/td[2]

//div[@class='intro' and //span[@class='code' and text()='ZY001']]//tbody/tr[td[text()='Available']]/td[2]

//div[@class='intro' and //span[@class='code' and text()='ZY001']]//tr[td[text()='Available']]/td[2]