node.js - 无法使用回调获取结果
问题描述
我编写了一个脚本,node
使用两个不同的函数getPosts()
并getContent()
在其中提供回调,以便打印调用独立函数的结果getResult()
。在我的脚本中定义的选择器是完美无缺的。
但是,当我执行我的脚本时,它什么也不打印。它也不会抛出任何错误。我试图模仿Neil在这篇文章中提供的逻辑。
我怎样才能成功?
到目前为止,我已经写过:
var request = require('request');
var cheerio = require('cheerio');
const url = 'https://stackoverflow.com/questions/tagged/web-scraping';
function getPosts(callback){
request(url, function (error,response, html) {
if (!error && response.statusCode == 200){
var $ = cheerio.load(html);
$('.summary .question-hyperlink').each(function(){
var items = $(this).text();
var links = $(this).attr("href");
callback(items,links);
});
}
});
}
function getContent(item,link,callback){
request(link, function (error,response, html) {
if (!error && response.statusCode == 200){
var $ = cheerio.load(html);
var proLink = $('.user-details > a').eq(0).attr("href");
callback({item,link,proLink});
}
});
}
function getResult() {
getPosts(function(item,link) {
getContent(item,link,function(output){
console.log(output);
});
});
}
getResult();
解决方案
link
您收到的值getPosts
是一个相对链接,这意味着请求失败。您可以在其自己的变量中提取主机名,并从主机名 + 相对链接创建完整的 URL。
const host = 'https://stackoverflow.com';
const url = '/questions/tagged/web-scraping';
// ...
function getContent(item,link,callback){
// Here we use the absolute URL
request(host + link, function (error,response, html) {
if (!error && response.statusCode == 200){
var $ = cheerio.load(html);
var proLink = $('.user-details > a').eq(0).attr("href");
callback({item,link,proLink});
}
});
}
推荐阅读
- three.js - threejs - 移动由单个函数的 2 次调用创建的 2 个球体
- excel - VB 脚本中需要的 Vlookup 函数辅助,对最近的工作表使用字符串
- xml - XML 中元素的顺序重要吗?
- kotlin - DataBinding - loadImage() 使用 Kotlin 发生 App 崩溃
- javascript - 努力实现游戏状态
- javascript - 子菜单中激活的 SVG 形状
- javascript - JavaScript Node.contains() 函数不检查内部子元素
- bash - 不会“污染”环境的可溯源脚本?
- java - Spring Boot:控制每个请求的序列化响应中是否存在空字段
- python - 如何拆分熊猫列并检查值?