XPath在某个标记之后选择一个元素(但在下一个标记之前或结束之前)

时间:2014-11-25 23:27:14

标签: xpath predicate

我正在尝试从表格中屏幕截取链接:

…
<table id="t">
  <tr><td>Section 1</td></tr>
  <tr><td>Some content</td></tr>
  <tr><td>Some content</td></tr>
  <tr><td>Some content</td></tr>
  <tr><td>Some content</td></tr>
  <tr><td><a href="some_link?for=one">View Report</a></td></tr>
  <tr><td>Section 2</td></tr>
  <tr><td>Some content</td></tr>
  <tr><td>Some content</td></tr>
  <tr><td>Some content</td></tr>
  <tr><td>No report for section three</td></tr>
  <tr><td>Some content</td></tr>
  <tr><td>Section 3</td></tr>
  <tr><td>Nothing for section four either.</td></tr>
  <tr><td>Section 4</td></tr>
  <tr><td>Some content</td></tr>
  <tr><td>Some content</td></tr>
  <tr><td><a href="some_link?for=four">View Report</a></td></tr>
  <tr><td>Some content</td></tr>
</table>
…

有三个部分,但它们在表格中呈线性而非分层表示。每个部分可能有零个或一个链接,其文本为“查看报告”。

什么是XPath,我可以用它来选择对应于Section n <a>元素(如果不存在这样的元素,则为空集合)?

作为第一次剪辑,我考虑了

//table[@id='t']/tr[td='Section %d']/following-sibling::tr/td/a['View Report'][1]

(其中%d n 的占位符)。但是,这会错误地选择 n = 2的最后一个链接。

我也可以试试

//table[@id='t']/tr[td='Section %d']/following-sibling::tr[following-sibling::tr/td='Section %d']/td/a['View Report'][1]

分别为 n n + 1添加了两个%d占位符,但这对最后一部分不起作用。此外,需要两次插值是不优雅的。是否有一个处理所有案例的好解决方案?

2 个答案:

答案 0 :(得分:2)

向后做:找到前面的&#34; Section Anything&#34;是&#34;部分&#34;你在寻找。

//a["View Report"][../../preceding-sibling::tr[td[contains(.,"Section")]][1][.="Section 3"]]/@href

答案 1 :(得分:0)

我不确定如果没有与相关部分对应的<a>元素,应返回什么内容,但是如果<a>,则xpath不会返回匹配项} element的前一部分的值高于相关部分的值 - 对于n = 2:

//table[@id='t']/tr[td='Section 2']/following-sibling::tr/td[
  not(./parent::tr/preceding-sibling::tr[
       normalize-space(translate(td,'Section',''))>2])
       ]/a['View Report'][1]

代表n:

//table[@id='t']/tr[td='Section n']/following-sibling::tr/td[
  not(./parent::tr/preceding-sibling::tr[
      normalize-space(translate(td,'Section',''))>n])
      ]/a['View Report'][1]