我无法弄清楚为什么我用这个非常简单的代码片段无法用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();
}
总是什么也不返回。
我错过了打印标题值?
答案 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();
});