在dom中查找包含带有xpath的单词的文本节点

dys*_*nal 5 javascript xpath dom

我需要从html文件中的节点中提取文本,我正在尝试使用XPath和Javascript.

必需条件是文本必须包含特定单词.

让我们以下面的html文件为例:

<html>
    <body>
        <p>
            Hi, try to extract the word username here and here <b>username</b>
        </p>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

并尝试使用此表达式从包含"username"一词的文本节点中获取文本:

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

通过搜索迭代我发现了所需的结果,但也发现了不需要的对象:

["Hi, try to extract the word username here and here", Text, "username"]
Run Code Online (Sandbox Code Playgroud)

其中Text是一个Object,其textContent只是回车符号(我正在使用谷歌Chrome控制台).这个对象来自哪里?

任何人都可以提供一个更精确的XPath表达式来排除那些对象,还是应该在我的代码中将它们排除?

理想的搜索应该是:

["Hi, try to extract the word username here and here", "username"]
Run Code Online (Sandbox Code Playgroud)

谢谢大家!

Lar*_*rsH 6

看起来像你想要的

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

(我不确定你为什么要在单引号内转出双引号,但这是一个单独的问题.)

你现有的代码,

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

说,

  • (1)查找具有包含"username"的文本节点子节点的所有元素.
  • (2)现在返回这些元素的所有文本节点子节点(不管它们包含什么).

表达式的(1)部分将返回元素节点<p><b>.

对于(2)步骤,<b>只有一个文本节点子节点,但<p>有两个:前一个<b>(包含"用户名")和后面一个<b>(仅包含空格).

解决方案:忘记元素 - 它们是无关紧要的分心.只需直接选择所需的文本节点即可.