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

XPath选择某个标记之后(但在下一个标记或结尾之前)的元素,xpath,predicate,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

我正在尝试从如下表中筛选刮取链接:

…
<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>
…
(其中,
%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
占位符,但这对最后一节不起作用。此外,需要两次插值是不雅观的。是否有一个好的解决方案可以处理所有情况?

我不确定在没有与所讨论的节对应的
元素的情况下应该返回什么,但是如果
元素的前一节的值高于所讨论的节的值,则以下xpath不会返回匹配项-对于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]

反向操作:找到前面的“任何部分”就是您要查找的“部分”的链接

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