我正在尝试编写一个简单的 PhantomJS 脚本,我在其中通过 ID 查找元素并确定它是否为空。我尝试了一些建议的东西,例如 .childNodes.length、.textContent 等。 这些要么导致空错误:
TypeError: null is not an object (evaluating 'document.getElementById('idname').childNodes')
或者幻影只是崩溃并且根本拒绝检查链接,如果我连续两次运行我的脚本而没有太多停顿,通常会发生这种情况。它有时会坐下来什么都不做。 我已经编写了其他以这种方式有效使用 getElementById 的抓取工具,并且它们都成功了,尽管我只是通过检查它是否为 !== null 来检查该元素是否存在。手动检查,我检查的所有页面中确实存在这个元素,只是它有时有内容有时没有(它是一个div)。不管怎样,这是我的代码:
var fs = require('fs')
var urls = fs.read('urls.txt').split('\n');
var page;
page = require('webpage').create();
console.log('The default user agent is ' + page.settings.userAgent);
page.settings.userAgent = 'SpecialAgent';
function check_link(url){
page = require('webpage').create();
page.open(url, function(status){
if (status !== 'success') {
console.log('Unable to access network');
} else {
var error = page.evaluate(function() {
return document.getElementById('error-message');
});
console.log(error.childNodes.length);
fs.write('results.csv', error.childNodes.length + ', ' + url + '\n', 'a');
page.release();
setTimeout(next_link, 1000);
}
});
}
function next_link(){
var url = urls.shift();
console.log(url);
if(!urls){
phantom.exit(0);
} else{
check_link(url);
}
}
next_link();
最佳答案
PhantomJS 通过 page.evaluate()
提供对沙盒页面上下文(DOM 上下文)的访问带有以下注释:
Note: The arguments and the return value to the
evaluate
function must be a simple primitive object. The rule of thumb: if it can be serialized via JSON, then it is fine.Closures, functions, DOM nodes, etc. will not work!
因此您不能将 DOM 节点传递到页面上下文之外,但您可以在页面上下文中用它做任何您想做的事情,然后传递结果。
var errors = page.evaluate(function() {
var e = document.getElementById('error-message');
return (e && e.childNodes) ? e.childNodes.length : -1
});
console.log(errors);
关于javascript - PhantomJS - 试图找出一个元素是否为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35417983/