我正在尝试从表格中屏幕截取链接:
…
<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
占位符,但这对最后一部分不起作用。此外,需要两次插值是不优雅的。是否有一个处理所有案例的好解决方案?
答案 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]