检索锚名单被破坏?(Retrieved anchors list gets corrupted?)

2019-10-20 10:21发布

我试图分析锚链接(其text中PhantomJS属性)。

检索发生在这里:

var list = page.evaluate(function() {
  return document.getElementsByTagName('a');
});

这将返回一个属性的对象length ,这是很好(相同length运行时,我得到document.getElementsByTagName('a');在控制台)。 但绝大多数在对象中的元素具有值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=/' );

Answer 1:

phantomjs许可证的当前版本只有原始类型(布尔,字符串,数字, []{}来传递去往和来自页上下文。 所以基本上所有的功能将被剥离,这就是DOM元素。 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 };
});


文章来源: Retrieved anchors list gets corrupted?