1

与えられた:

<tr>
  <td><a href="http://foo.com">Keyword 1</a></td>
  <td><a href="http://bar.com">Keyword 2</a></td>
  <td><a href="http://wombat.com">Keyword 3</a></td>
</tr>

<tr>
  <td><a href="http://blah.com">Keyword 4</a></td>
  <td><a href="http://woof.com">Keyword 5</a></td>
  <td><a href="http://miaow.com">Keyword 6</a></td>
</tr>

テーブルセル内の各URIを一致させる必要があります。キーワードはドキュメント全体で一貫しています。ドキュメント全体のリンクを問題なく照合できます。

var links_in_document = document.evaluate(
  "//a[starts-with(text(),'Keyword')]",
  document,
  null,
  XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
  null);

ただし、TRノードを参照する簡単な方法はありますが、行内のリンクを取得するための適切なXPathを見つけることができないようです。以下のスニペットは、最初のTDの最初のリンクを提供しているようですが、残りは提供していません。ヘルプ?

var links_in_row = document.evaluate(
  ".//a[starts-with(text(),'Keyword')]",
  row,
  null,
  XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,
  null);

(ここで、「行」はコンテキストノードです)。

編集:おそらく私は明確ではありませんでした、私はドキュメントレベルからのリンクをうまく見つけることができます。XPathのコンテキストとしてTRノードを使用して、単一行のリンクを分離しようとしています。

編集:興味のために、解決策。私が取り組んでいた壊れたマークアップにはid属性がなかったので、いくつか追加して続行することができました。スニペット:

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 );
}
4

3 に答える 3

3

HTML の例と次のコードを使用した JavaScript シェルでの簡単なテスト:

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++;
}

プリントアウト:

Keyword 1
Keyword 2
Keyword 3

これは、正しく機能していることを示しています。私が行った唯一の変更は、行レベルではなく、ドキュメントで開始することでした...

于 2009-07-03T09:58:30.123 に答える
1

バートが書いたものを拡張すると、これは私にとってはうまくいきます。

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++;
}

プリントアウト:

NEW ROW----
Keyword 1
Keyword 2
Keyword 3
NEW ROW----
Keyword 4
Keyword 5
Keyword 6

コピペしたもの以外に何か足りないものがあると思います。

バートは、この私見に対する答えを得るはずです。

于 2009-07-07T00:21:15.867 に答える
0

試す:

子孫::*[self::a[starts-with(text(), 'キーワード')]]
于 2009-07-06T23:46:59.110 に答える