6

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

要求的条件是文本必须包含特定的单词。

让我们以下一个 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"]

其中 Text 是一个对象,其 textContent 只是回车符(我使用的是 Google Chrome 控制台)。这个物体是从哪里来的?

请问谁能给出一个更精确的 XPath 表达式来排除这些对象,或者我应该在我的代码中排除它们吗?

理想的搜索应该是:

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

谢谢大家!

4

1 回答 1

8

看起来你想要

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) 查找所有具有包含“用户名”的文本节点子节点的元素。
  • (2) 现在返回这些元素的所有文本节点子节点(不管它们包含什么)。

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

对于第 (2) 步,<b>只有一个文本节点子节点,但<p>有两个子节点:一个在前面<b>(包含“用户名”),另一个在后面<b>(只包含空格)。

解决方案:忘记元素——它们是无关紧要的干扰。只需直接选择所需的文本节点。

于 2012-10-08T14:06:23.233 回答