检索到的锚列表已损坏
Retrieved anchors list gets corrupted?
我试图在PhantomJS中分析锚链接(它们的text
属性)。
检索发生在这里:
var list = page.evaluate(function() {
return document.getElementsByTagName('a');
});
这将返回一个具有良好属性length
的对象(我在控制台中运行document.getElementsByTagName('a');
时获得的相同length
)。但是对象中的绝大多数元素的值都是null
,这是不好的。我不知道为什么会这样。
我一直在玩通过slice
转换成一个真正的数组,这没有什么好处。我试过不同的网站,没有区别。我已经转储了。png文件,以验证正确加载和网站正确加载。
这显然不是完整的脚本,而是一个最小的脚本,显示了一个众所周知的公共站点的问题;)
如何从加载的页面检索完整的锚列表?
var page = require('webpage').create();
page.onError = function(msg, trace)
{ //Error handling mantra
var msgStack = ['PAGE ERROR: ' + msg];
if (trace && trace.length) {
msgStack.push('TRACE:');
trace.forEach(function(t) {
msgStack.push(' -> ' + t.file + ': ' + t.line + (t.function ? ' (in function "' + t.function +'")' : ''));
});
}
console.error(msgStack.join(''n'));
};
phantom.onError = function(msg, trace)
{ //Error handling mantra
var msgStack = ['PHANTOM ERROR: ' + msg];
if (trace && trace.length) {
msgStack.push('TRACE:');
trace.forEach(function(t) {
msgStack.push(' -> ' + (t.file || t.sourceURL) + ': ' + t.line + (t.function ? ' (in function ' + t.function +')' : ''));
});
}
console.error(msgStack.join(''n'));
phantom.exit(1);
};
function start( url )
{
page.open( url , function (status)
{
console.log( 'Loaded' , url , ': ' , status );
if( status != 'success' )
phantom.exit( 0 );
page.render( 'login.png');
var list = page.evaluate(function() {
return document.getElementsByTagName('a');
});
console.log( 'List length: ' , list.length );
for( var i = 0 ; i < list.length ; i++ )
{
if( !list[i] )
{
console.log( i , typeof list[i] , list[i] === null , list[i] === undefined );
//list[i] === null -> true for the problematic anchors
continue;
}
console.log( i, list[i].innerText , ',' , list[i].text /*, JSON.stringify( list[i] ) */ );
}
//Exit with grace
phantom.exit( 0 );
});
}
start( 'http://data.stackexchange.com/' );
//start( 'http://data.stackexchange.com/account/login?returnurl=/' );
当前版本的phantomjs只允许基本类型(boolean, string, number, []
和{}
)在页面上下文之间传递。所以基本上所有的函数都将被剥离,这就是DOM元素。t.t niese从文档中找到了引用:
注意:求值函数的参数和返回值必须是简单的原语对象。经验法则:如果它可以通过JSON序列化,那么它就可以了。
闭包、函数、DOM节点等将无法工作!
您需要在页面上下文中完成部分工作。如果需要每个节点的innerText
属性,则需要首先将其映射到基本类型:
var list = page.evaluate(function() {
return Array.prototype.map.call(document.getElementsByTagName('a'), function(a){
return a.innerText;
});
});
console.log(list[0]); // innerText
你当然可以同时映射多个属性:
return Array.prototype.map.call(document.getElementsByTagName('a'), function(a){
return { text: a.innerText, href: a.href };
});
相关文章:
- 检测图像URL是否已损坏JQUERY
- 节点:通过请求下载zip,zip已损坏
- 将 MVC 3 应用程序部署到 URL 文件夹已损坏 JavaScript 和内容路径
- 从 Base64 转换图像时出错 - HTMLImageElement 已损坏
- 异步加载JQuery时Tabbed Box已损坏
- Angular 2-检查图像url是否有效或已损坏
- JCrop使用集合选择选项时插件已损坏
- Jquery提交表单已损坏
- MongoDB 在保存数据时抛出错误(拓扑已损坏)
- iOS 7 全屏 Web 应用程序中的 JavaScript 警报已损坏
- MongoDB本机节点驱动程序:解释已损坏
- 已选择选项已损坏或.
- Base64 - 文件已损坏
- 我的 mailto 链接中的换行符在 Android 手机上已损坏
- 为什么 Chrome 扩展程序图片在添加到 DOM 时显示为已损坏
- $parent变量在ng-include上从单独的控制器设置时已损坏
- base64 映像已损坏上传到 S3
- .fadeIn()和.fadeOut()函数已损坏
- D3.js enter()对于svg形状动画已损坏,但更新和删除它们都很好
- 检索到的锚列表已损坏