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