6

HTML ファイルのノードからテキストを抽出する必要があり、XPath と Javascript を使用しようとしています。

必要な条件は、テキストに特定の単語が含まれている必要があるということです。

次の html ファイルを例に取りましょう。

<html>
    <body>
        <p>
            Hi, try to extract the word username here and here <b>username</b>
        </p>
    </body>
</html>

そして、次の式を使用して、「username」という単語を含むテキスト ノードからテキストを取得してみてください。

var search = document.evaluate('//*[contains(child::text(), \"username\")]/child::text()', document, null, XPathResult.ANY_TYPE, null);

検索を繰り返すと、目的の結果が見つかりましたが、不要なオブジェクトも見つかりました:

["Hi, try to extract the word username here and here", Text, "username"]

ここで、Text は、textContent が改行記号のみのオブジェクトです (私は Google Chrome コンソールを使用しています)。このオブジェクトはどこから来たのですか?

これらのオブジェクトを除外するより正確な XPath 式を教えてください。または、コードでそれらを除外する必要がありますか?

理想的な検索は次のとおりです。

["Hi, try to extract the word username here and here", "username"]

みんなありがとう!

4

1 に答える 1

8

欲しいらしい

var search = document.evaluate('//text()[contains(., \"username\")]',
   document, null, XPathResult.ANY_TYPE, null);

(一重引用符内で二重引用符をエスケープしている理由はわかりませんが、それは別の問題です。)

既存のコード、

var search = document.evaluate('//*[contains(child::text(), \"username\")]/
         child::text()', document, null, XPathResult.ANY_TYPE, null);

言う、

  • (1) 「username」を含むテキスト ノードの子を持つすべての要素を検索します。
  • (2)これらの要素のすべてのテキスト ノードの子を返すようになりました (内容に関係なく)。

式の (1) の部分は、要素ノード<p>とを返します<b>

(2) ステップの場合、<b>テキスト ノードの子は 1 つだけですが、<p>2 つ<b>(「ユーザー名」を含む) の前と (<b>空白のみを含む) の後に 2 つあります。

解決策: 要素のことは忘れてください。それらは無関係な気を散らすものです。目的のテキスト ノードを直接選択するだけです。

于 2012-10-08T14:06:23.233 に答える