2012-10-08 34 views
3

我需要从html文件中的节点中提取文本,并尝试使用XPath和Javascript。在dom中查找包含带xpath的单词的文本节点

所需条件是文本必须包含特定的词。

让我们通过实例的下一个HTML文件:

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

,并得到包含单词“用户名”这种表达从文本节点文本:

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"] 

其中文本是对象其textContent仅为回车符(我正在使用Google Chrome控制台)。这个对象来自哪里?

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

理想的搜索应该是:

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

谢谢大家!

回答

4

看起来像你想

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>后的一个(只包含空格)。

解决方案:忘掉元素 - 它们是不相干的分心。只需直接选择所需的文本节点即可。

+0

非常感谢!在提出我的问题之后,我已经看到了灯光并找到了解决方案,就像您发布的解决方案一样,但我无法解释为什么(2)会发生。现在我可以;)在简单的内部跳出双引号是我的错误,不需要,谢谢你的提示! – dysfuntcional

相关问题