所以我有一個基本的表格結構:
<tbody>
<tr>
<td></td>
<td></td>
<tr>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
</tr>
</tbody> etc....
<a>僅當其上方的單元格不包含單詞時,我才嘗試在一個單元格中定位鏈接元素。例如:
<tbody>
<tr>
<td></td>
<td></td>
<tr>
<tr>
<td></td>
<td><b>Fire Sale!</b></td>
</tr>
<tr>
<td></td>
<td><a href="something">linktext</a></td>
</tr>
/tbody>
所以我只想定位<a>它上面的單元格不包含“Fire Sale!”。
問題是無論我做什么,我都無法保留條件軸來找到正上方的單元格。
<tbody>
<tr>
<td></td>
<td><b>Fire Sale!</b></td>
</tr>
<tr>
<td><a href="somethingelse">link I don't want</a></td>
<td><a href="something">linktext</a></td>
</tr>
/tbody>
我嘗試過類似的東西:
//tr/td/b/a[@href]/ancestor::tbody/tr/td/b[contains(text(),'Fire Sale!')]
但無論如何,由于 tr 和 td 之間的奇怪關系,我總是最終得到一個肯定的條件。也就是說,它們在大多數情況下共享相同的祖先樹結構,并且定位回<td>我的主要目標似乎是不可能的。有什么方法可以使用變數,或者我覺得 count() 可能會有所幫助,但我只是不確定整個事情的語法。
有任何想法嗎?
編輯:這是真正的 HTML
<table border="0" width="100%" style="border-collapse: collapse">
<tr>
<td width="33%" valign="top" height="225" align="center"><img border="0" src="" width="296" height="225"></td>
<td width="33%" valign="top" height="225" align="center"><br><br><br><br><b>Unassigned</b></td>
<td width="33%" valign="top" height="225" align="center"></td>
</tr>
<tr>
<td width="33%" valign="top" height="30" align="center"><b><a href="">AAAAA</a></b><br>
<b>XXXXXXX</b><br><b><font color="#FF0000">YYYYYYYYY</font><br></b><br></td>
<td width="33%" valign="top" height="30" align="center"><b><a href="">BBBBB</a><br></b><br></td>
<td width="33%" valign="top" height="30" align="center"></td>
</tr>
<tr>
<td width="100%" colspan="4" height="80" align="center">
| <a href=""> Home</a> |<br>
| <a href="">Design</a>
| <a href="">Styles</a>
| <a href="">X Listings</a>
| <a href="">Y Listings</a> |<br>
| <a href="">About the Author</a> |</td>
</tr>
<tr>
<td width="100%" colspan="4" height="60" align="center">
Copyright Some Dude, 2020<br>
Email: <a href="">[email protected]</a></td>
</tr>
</table>
所以基本上我想要包含 BBBBB 的鏈接,前提是它上面沒有出現“未分配”這個詞。
編輯 2 以澄清僅當上述單元格中的文本不存在時才應定位鏈接。
uj5u.com熱心網友回復:
試試下面這個有點復雜的 XPath-1.0 運算式。它將為您提供包含給定字串的前一行單元格索引的<a>鏈接屬性:href
//tr/td[count(../preceding-sibling::tr[1]/td[contains(.,'Fire Sale!')]/preceding-sibling::td) 1]/a/@href
EDIT1:
如果存在新的給定值“未分配”,則選擇鏈接的更嚴格版本如下:
//tr[preceding-sibling::tr[1]/td[contains(.,'Unassigned')]]/td[count(../preceding-sibling::tr[1]/td[contains(.,'Unassigned')]/preceding-sibling::td) 1]//a
uj5u.com熱心網友回復:
您可能首先獲取tbody/tr/td/b包含的內容Fire Sale!,然后通過祖先 tr 導航到下一個 tr。
請注意,在您的運算式中,這部分將不匹配,因為示例資料中的標簽中//tr/td/b/a[@href]沒有包含錨點。b
//tbody/tr/td/b[contains(text(),'Fire Sale!')]/ancestor::tr/following-sibling::tr[1]/td/a[@href]
uj5u.com熱心網友回復:
我將使用更簡化的搜索文本(“xx”),同時嘗試更復雜的元素結構來證明我的方法。
使用此輸入:
<tbody>
<tr>
<td></td>
<td><b>xx</b></td>
</tr>
<tr>
<td><a href="somethingelse">link I don't want</a></td>
<td><a href="something">linktext</a></td>
</tr>
<tr>
<td></td>
<td>xx</td>
<td> </td>
<td>xx</td>
</tr>
<tr>
<td><a href="nok">don't want it</a></td>
<td><a href="ok">want it</a></td>
<td><a href="nok">don't want it</a></td>
<td><a href="ok">want it</a></td>
</tr>
</tbody>
并應用此 XPath 運算式:
//td[a and count(preceding-sibling::td) =
parent::tr/preceding-sibling::tr[1]/td[.//text() = 'xx']/count(preceding-sibling::td)]/a
我得到了三個通緝<a>犯。<td>想法是計算“我”之前的 s 的數量,并檢查 ( parent::tr/preceding-sibling::tr[1])上面的行中是否<td>存在包含搜索字串并且<td>在它之前具有相同數量的 ' 的情況。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/484308.html
