猿问

使用nodejs抓取时,出现转码问题

newsList和newsDetail单独拿出来调试没有问题。但如下放在一起时,提示
bodyisnotdefined
经多次调试,错误节点应该是出现在readNewsDetail()中
//转换gbk编码的网页内容
body2=iconv.decode(body,'gbk');
//根据网页内容创建DOM操作对象
var$=cheerio.load(body2);
这两句。因为直接var$=cheerio.load(res.body.toString());的话,不会报错。但这样一来,输出的就是乱码了,所以必须转码。但一按照我的写法转码,就会报错……
请教各位,这个问题应该怎么解决呢?
源码:
varrequest=require('request');
varcheerio=require('cheerio');
variconv=require('iconv-lite');
varasync=require('async');
vardebug=require('debug')('sina1:update');
/**
*获取新闻列表
*/
functionreadNewsList(url,callback){
debug('读取新闻列表:%s',url);
request(url,function(err,res){
if(err)returncallback(err);
//根据网页内容创建DOM操作对象
var$=cheerio.load(res.body.toString());
//读取新闻列表
varnewsList=[];
$('.news-item').each(function(){
var$me=$(this);
var$title=$me.find('h2a');
var$time=$me.find('.time');
var$url=$me.find('h2a');
varitem={
title:$title.text().trim(),
url:$url.attr('href'),
time:$time.text().trim()
};
newsList.push(item);
});
//返回结果
callback(null,newsList);
});
}
/**
*获取新闻页面内容
*/
functionreadNewsDetail(url,callback){
debug('读取新闻内容:%s',url);
request(url,function(err,res){
if(err)returncallback(err);
//转换gbk编码的网页内容
body2=iconv.decode(body,'gbk');
//根据网页内容创建DOM操作对象
var$=cheerio.load(body2);
//获取正文内容
varnewsDetail=[];
$('.article').each(function(){
var$me=$(this);
var$img=$me.find('.img_wrapperimg');
varitem={
content:$me.html().trim(),
img:$img.attr('src')
};
newsDetail.push(item);
});
//返回结果
callback(null,newsDetail);
});
}
//读取列表下的所有新闻
readNewsList('http://news.sina.com.cn/china/',function(err,newsList){
if(err)returnconsole.error(err.stack);
//依次取出newsList数组的每个元素,调用第二个参数中传入的函数
//函数的第一个参数即是newsList数组的其中一个元素
//函数的第二个参数是回调函数
async.eachSeries(newsList,function(news,next){
//读取新闻正文
readNewsDetail(news.url,function(err,detail){
console.log(detail);
//if(err)console.error(err.stack);
//
////直接显示
//console.log(detail);
//
//
////需要调用next()来返回
//next();
});
},function(err){
//当遍历完newsList后,执行此回调函数
if(err)returnconsole.error(err.stack);
console.log('完成');
});
});
慕雪6442864
浏览 448回答 2
2回答

大话西游666

帅哥,你确定你这个单独运行的时候可以?request(url,function(err,res){if(err)returncallback(err);//转换gbk编码的网页内容body2=iconv.decode(body,'gbk');//根据网页内容创建DOM操作对象var$=cheerio.load(body2);//获取正文内容varnewsDetail=[];$('.article').each(function(){var$me=$(this);var$img=$me.find('.img_wrapperimg');varitem={content:$me.html().trim(),img:$img.attr('src')};newsDetail.push(item);});//返回结果callback(null,newsDetail);});应该是varbody2=iconv.decode(res.body,'gbk');吧
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答