Greasemonkey,XPath:查找表行中的所有链接

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')]]