Greasemonkey, XPath: find all links within table row
给出:
1 2 3 4 5 6 7 8 9 10 11 | <tr> <td>Keyword 1</td> <td>Keyword 2</td> <td>Keyword 3</td> </tr> <tr> <td>Keyword 4</td> <td>Keyword 5</td> <td>Keyword 6</td> </tr> |
我需要匹配表单元格中的每个URI。关键字在整个文档中是一致的。我可以毫无问题地匹配整个文档的链接:
1 2 3 4 5 6 | var links_in_document = document.evaluate( "//a[starts-with(text(),'Keyword')]", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); |
但是,即使我有一个简单的方法来引用TR节点,我似乎也找不到正确的XPath来获取行中的链接。下面的代码片段似乎给了我第一个TD的第一个链接,但没有给其余的链接。帮助吗?
1 2 3 4 5 6 | var links_in_row = document.evaluate( ".//a[starts-with(text(),'Keyword')]", row, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); |
(其中\\'row \\'是上下文节点)。
编辑:也许我不清楚,我可以找到文档级别的链接。我试图通过使用TR节点作为XPath的上下文来隔离单行中的链接。
编辑:感兴趣的解决方案。我正在使用的折断标记没有id属性,因此我添加了一些标记就可以继续进行。片段:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | var exhibit_link; for( var i = 0; i < all_exhibit_links.snapshotLength; i++ ) { exhibit_link = all_exhibit_links.snapshotItem( i ); // The rows have no unique ID, so we need to give them one. // This will give the XPath something to 'latch onto'. exhibit_link.parentNode.parentNode.id = 'ex_link_row_' + i.toString(); exhibit_link.addEventListener("click", function( event ) { var row_id = event.target.parentNode.parentNode.id; // Find only those links that are within rows with the corresponding id var row_links = document.evaluate( "id('" + row_id +"')/td/a[starts-with(text(),'Exhibit')]", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); // Open each link in a new tab for( var j = 0; j < row_links.snapshotLength; j++ ) { row_link = row_links.snapshotItem( j ); GM_openInTab( row_link.href ); } // Suppress the original function of the link event.stopPropagation(); event.preventDefault(); }, true ); } |
使用您的html示例和以下代码在JavaScript Shell中进行快速测试:
1 2 3 4 5 6 | var links_in_row = document.evaluate(".//a[starts-with(text(),'Keyword')]" , document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); var i = 0; while( (link = links_in_row.snapshotItem(i) ) != null) { print(link.innerHTML);i++; } |
打印出:
1 2 3 | Keyword 1 Keyword 2 Keyword 3 |
表示它正常工作。
我所做的唯一更改不是从行级别开始,而是从文档...
开始
扩展了bert所写的内容,对我有用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | var rows = document.evaluate("//tr" , document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); var i = 0; while( (row = rows.snapshotItem(i) ) != null) { print( 'NEW ROW----'); var links = document.evaluate(".//a[starts-with(text(),'Keyword')]", row, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); var k = 0; while ((link = links.snapshotItem(k)) != null) { print( link.innerHTML ); k++; } i++; } |
打印输出:
1 2 3 4 5 6 7 8 | NEW ROW---- Keyword 1 Keyword 2 Keyword 3 NEW ROW---- Keyword 4 Keyword 5 Keyword 6 |
我认为复制粘贴之外还缺少一些东西。
bert应该得到这个恕我直言的答案。
尝试:
1 | descendant::*[self::a[starts-with(text(), 'Keyword')]] |