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

时间:2012-10-08 13:14:57

标签: javascript dom xpath

我需要从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是一个Object,其textContent只是回车符号(我使用的是Google Chrome控制台)。这个对象来自哪里?

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

理想的搜索应该是:

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

谢谢大家!

1 个答案:

答案 0 :(得分:5)

看起来像你想要的

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>只有一个文本节点子节点,但<p>有两个:<b>之前的一个(包含“用户名”)和在<b>之后(仅包含空格)。

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

相关问题