我需要从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"]
谢谢大家!
答案 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)部分将返回元素节点<p>
和<b>
。
对于(2)步骤,<b>
只有一个文本节点子节点,但<p>
有两个:<b>
之前的一个(包含“用户名”)和在<b>
之后(仅包含空格)。
解决方案:忘记元素 - 它们是无关紧要的分心。只需直接选择所需的文本节点即可。