我们正在创建一个简单的脚本来浏览网站的站点地图,并获取所有链接和href值,然后将其保存到.json列表中,另一个模块可以使用该列表截取这些访问过的页面的屏幕截图
到目前为止,我们可以获得抓住列表工作的功能。当它在控制台中运行时,我们想要放入数组的数据显示出来。
在终端中运行时,找不到任何内容,并且未填充数组。
var fs = require('fs');
var Horseman = require('node-horseman');
var horseman = new Horseman();
function findAllUrls(selector) {
var urls = [];
// get all the anchors
$(selector).each(function() {
// loop through each anchor and get the href value
var url = {
title: $(this).text(),
url: $(this).attr("href")
};
// put the href value in a new array
urls.push(url);
});
// finally return the array of all the href value
console.log("Log all urls from findAllUrls", urls);
return urls;
};
horseman
.open(URL goes here)
.evaluate(findAllUrls, '.sitemap-links a')
.then(function(urls) {
console.log(urls);
// Save the urls to a json file (lookup node 'fs' module)
fs.writeFile('urls.json', urls, function (err) {
if (err) throw err;
console.log('saved to urls.json');
});
})
.close();
运行测试时会跳过某些内容。我有一种感觉,它是用PhantomJS模拟浏览器而不是保持数组然后通过。
答案 0 :(得分:0)
Horseman是基于Promise的API。因此,findAllUrls必须返回一个promise。 .then期待一个承诺,而不是一个数组。发生了什么。然后在findAllUrls返回之前运行,因为它没有任何期望。我建议你阅读承诺here。 This是关于承诺的另一篇优秀文章。最后,来自骑手文档的this example非常类似于您要做的事情。
这样的事情可能适用于你想要做的事情(未经测试):
function findAllUrls(selector) {
return horseman.evaluate(function () {
var urls = [];
// get all the anchors
$(selector).each(function() {
// loop through each anchor and get the href value
var url = {
title: $(this).text(),
url: $(this).attr("href")
};
// put the href value in a new array
urls.push(url);
});
// finally return the array of all the href value
console.log("Log all urls from findAllUrls", urls);
return urls;
});
};
答案 1 :(得分:0)
我遇到了类似的问题。它只是意味着你的评估函数,骑士遇到了一个错误(但根据经验,它没有显示它是什么错误)。如果遇到错误,它将自动返回null。
解决方案是逐行仔细检查您的评估函数,哪一个生成错误,这可能很难,因为骑士没有指出哪一行有问题。
旁注,evaluate函数有多个返回值的选项:callback,promise和actual value。因此,可以立即返回值,不需要承诺,如文档中所述。