【问题标题】:using XPath to find node under a context node does not work (firefox/firebug/javascript)使用 XPath 在上下文节点下查找节点不起作用(firefox/firebug/javascript)
【发布时间】:2011-01-24 19:15:44
【问题描述】:

我想从网页中提取信息。

页面有m个节点,可以通过.evaluate("//div[@class='news']", document, ....)找到。

对于上述每个节点,它们内部都有 3 个节点。他们每个人都有不同的@class 选择器。我想提取这m个三元组记录。

我尝试按照中的说明使用 .evaluate() 函数

https://developer.mozilla.org/en/Introduction_to_using_XPath_in_JavaScript

通过使用此代码

parentNodes = document.evaluate("//div[@class='news']", document, ....).
while (true){
   var node = parentNodes.iterateNext();
   var child = document.evaluate("//div[@class='title']", node, ....). 
   ...
}

但是,“child”总是分配给文档中的第一个节点,而不是“node”中的第一个节点。

我在 firebug 控制台中运行了这个。

有谁知道怎么回事?

【问题讨论】:

    标签: javascript firefox dom xpath firebug


    【解决方案1】:

    您正在对文档调用评估。因此,XPath 表达式是从 XML 树的根开始计算的。此外,如果您希望 XPath 从当前上下文中选择一个节点,例如在当前节点的子节点中,您应该使用.// 上下文选择器。

    【讨论】:

    • 那个“。”前面是关键。对我来说似乎很奇怪你可以指定一个上下文,但路径仍然是相对于根的。耸耸肩。
    • @dbreaux 就像在 linux shell 中一样,/bin/bash 指向根目录,无论您在哪里,如果当前目录中有另一个名为 bin 的目录,则必须执行 ./bin/bashbin/bash
    • 如果不是来自document,你还能怎么打电话给evaluate
    【解决方案2】:

    如果您使用“/”开始 XPath 表达式,那么您将从上下文节点的根节点/文档节点开始向下。因此,不要使用"//div[@class = 'title']",而是使用"descendant::div[@class = 'title']",这样您就可以选择上下文节点的后代 div 元素。

    【讨论】:

    • 顺便说一句 descendant::div[@class = 'title'] 等同于 .//div[@class = 'title']
    【解决方案3】:

    您也可以使用location path selector descendant-or-self。像这样:descendant-or-self::div... 供参考,启动作为上下文传递的节点。

    我希望我有所帮助。

    【讨论】:

      【解决方案4】:

      使用.// 而不是//

      来自XML Path Language specification (XPath), Version 1.0的解释:

      • //para 选择文档根的所有 para 后代,因此选择与上下文相同的文档中的所有 para 元素 节点

      • .选择上下文节点

      • .//para 选择上下文节点的para 元素后代

      当前的最佳答案是错误的,因为无法在任何其他对象上调用 .evaluate,而是在 document 上调用。 document.evaluate 是正确的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-04-11
        • 2010-09-20
        • 2010-11-04
        • 2012-02-29
        • 2011-02-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多