0

我需要从一页中抓取 url,我使用 phantomjs 制作了这个循环。但它不起作用,我不知道为什么。

function() {
var f = fs.open('parse.txt', 'a');
  for (var x = 0; x <= 15; x++) {
    var hrefs = page.evaluate(function(x) {
        return $('.login').eq(x).attr('href');
    }, 'hrefs');
  f.write(hrefs + '\r\n');;
  }
f.close();

}

我试图用一个数组来做到这一点,但它也失败了。

var array = [];
page.evaluate(function(array){
  for (var z = 0; z<=15; z++) {
    array.push($('.login').eq(z).attr('href'));
  }
}, array);
console.log(array.length); // 0
4

1 回答 1

2

这对我有用。

// var webpage = require('webpage');
var page = require('webpage').create();
var fs = require('fs');
var system = require('system');
var address = "https://jquery.org";

console.log("Opening page : " + address);
// var page = webpage.create();
page.open(address, function(status) {
    console.log('Status? '+status);
    if ( status !== 'success') {
      console.log("Failed to load the address...");
      phantom.exit();
    }
    var f = fs.open('parse.txt', 'a');
    for (var x = 0; x<=15; x++ ) {
      var href = page.evaluate(function(x) {
        return $('a').eq(x).attr('href');
      }, x);
      console.log(href);
      f.write(href + '\r\n');
    }
    f.close();
    phantom.exit();
});

一些笔记。

在第一个示例中,您不需要从函数 x 中删除“x”,您需要将 x 传递给 page.evaluate 作为包含要传递给函数的值的变量,一旦它在浏览器中。

IE
page.evaluate(function(x) {...}, x);

代替

page.evaluate(function(x){...}, hrefs)

绝对不是

page.evaluate(function() { return x; })

鉴于理解完成第二个示例的适当方法是:

var array = page.evaluate(function() {
    var result = [];
    for (var z = 0; z<=15; z++) {
        result.push($('.login').eq(z).attr('href'));
    }
    return result;
});
于 2013-11-12T21:56:25.373 回答