Xpath:查找节点旁边的节点(如果存在)

时间:2016-09-14 13:02:40

标签: xpath

我试图使用高度变化的HTML结构来抓取网站。感兴趣的信息未封装。唯一的标记是目标ID为TARGETID的跨度。

结构是:

<h2>
   <span class="TARGETID">TARGETID</span>
</h2>
<p> <!-- this is not always present, could be more p tags --> </p>
<ul> <!-- also not always present, if there, this is what we want --> </ul>
<h2>
   <span class="SOMEIRRELEVANTID">IRRELEVANT</span>
</h2>

我的方法是:

//h2/span[contains(text(), 'TARGETID')]/../following-sibling::ul[1][count(li) > 1][li]//a/text()

在TARGETID之后存在无序列表时会成功,但如果没有,则会找到它找到的下一个无序列表(根据查询有意义)。

我的问题是:我如何将查询限制在两个H2的节点上,从包含目标ID的跨度的节点开始,并受到任何后续H2的限制,跨度为不同的id? / p>

非常感谢任何提示。

1 个答案:

答案 0 :(得分:0)

这个XPath,

//ul[preceding::h2[1][.='TARGETID']]//a

将选择a下的所有ul元素,这些元素出现在h2之后,字符串值为"TARGETID"但在任何其他h2元素之前。

所以,对于这个扩展的例子,

<div>
  <h2>
    <span class="TARGETID">TARGETID</span>
  </h2>
  <p> <!-- this is not always present, could be more p tags --> </p>
  <ul> <a href="example.com">link1</a> </ul>
  <h2>
    <span class="SOMEIRRELEVANTID">IRRELEVANT</span>
  </h2>
  <ul> <a href="example.com">link2</a> </ul>
  <h2>
    <span class="SOMEIRRELEVANTID">IRRELEVANT</span>
  </h2>
</div>

它只会选择

<a href="example.com">link1</a>
根据要求,

<a href="example.com">link2</a>