无法弄清楚为什么我无法使用Xpath检索一个简单的字符串

时间:2016-03-30 06:40:51

标签: javascript xpath phantomjs

我无法弄清楚为什么我用这个非常简单的代码片段无法用XPath检索一个简单的字符串

var page = new WebPage();
page.open('http://free.fr', function (status) {
    if (status !== 'success') {
        console.log('Unable to access network');
    } else {
        function getElementByXpath(path) {
          return document.evaluate(path, document, null, XPathResult.STRING_TYPE, null).stringValue;
        }

        console.log( getElementByXpath("//title/text()") );
    }
    phantom.exit();
}

总是什么也不返回。

我错过了打印标题值?

1 个答案:

答案 0 :(得分:2)

PhantomJS有两个上下文。只有DOM上下文(页面上下文)可以访问DOM,但它是沙箱。您可以通过page.evaluate访问DOM上下文。但请记住:

  

注意: evaluate函数的参数和返回值必须是一个简单的原始对象。经验法则:如果它可以通过JSON序列化,那就没关系了。

     

闭包,函数,DOM节点等将工作!

这意味着您无法将找到的任何DOM节点传递给外部上下文。虽然,DOM上下文之外有一个document对象,但它没有做任何事情。它只是PhantomJS在QtWebkit上编写的一种方式。

以下是一个示例修复:

var page = new WebPage();
page.onConsoleMessage = function(msg){
    console.log("remote: " + msg);
};
page.open('http://google.fr', function (status) {
    if (status !== 'success') {
        console.log('Unable to access network');
    } else {
        page.evaluate(function(){
            function getElementByXpath(path) {
              return document.evaluate(path, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
            }

            console.log( getElementByXpath("//head/title/text()").textContent );
        });
    }
    phantom.exit();
});