2013-12-08 34 views
1

时,我有以下代码:空体使用请求

var request = require('request'); 
var cheerio = require('cheerio'); 
var URL = require('url') 
var fs = require('fs') 
fs.readFile("urls.txt", 'utf8', function(err, data) { 
    if (err) throw err; 
    var urls = data.split('\n'); 
    urls = urls.filter(function(n){return n}); 
    for(var i in urls) { 
     request(urls[i], function(err, resp, body) { 
      if (err) 
       throw err; 
      $ = cheerio.load(body,{lowerCaseTags: true, xmlMode: true}); 
      $('item').each(function(){ 
       console.log("----------"); 
       console.log($(this).find('title').text()); 
       console.log($(this).find('link').text()); 
       console.log($(this).find('pubDate').text()); 
      }); 
     }).end(); 
    } 
}); 

并从urls.txt文件我只有下面的网址:

http://www.visir.is/section/?Template=rss&mime=xml

当我使用wget在那个URL上我得到一个响应,看起来像一个rss feed,但是当我在上面的代码中执行它时,它是空的。有人可以向我解释为什么以及如何解决这个问题?

+0

'.END()'是多余的,你可以将其删除,并检查? – vmx

+0

此外,请求操作是异步的,您的for循环可能无法按预期工作。使用[异步](https://github.com/caolan/async)模块以适合的方式加载串联/并行的url。 – vmx

回答

2

更新:只需从原始脚本工作中删除.end()即可。 end()终止回调脚本。国际海事组织,在2016年,我肯定会选择请求针。


Request是一个奇怪的鸟,为什么它不是在你的工作的情况下它都给予响应中的任何信息。

尝试用Needle代替:

var needle = require('needle'); 
var cheerio = require('cheerio'); 
var URL = require('url') 
var fs = require('fs') 
fs.readFile("urls.txt", 'utf8', function(err, data) { 
    if (err) throw err; 
    var urls = data.split('\n'); 
    urls = urls.filter(function(n){return n}); 
    for(var i in urls) { 
     needle.get(urls[i], function(err, resp, body) { 
      if (err) 
       throw err; 
      $ = cheerio.load(body,{lowerCaseTags: true, xmlMode: true}); 
      $('item').each(function(){ 
       console.log("----------"); 
       console.log($(this).find('title').text()); 
       console.log($(this).find('link').text()); 
       console.log($(this).find('pubDate').text()); 
      }); 
     }); 
    } 
}); 
+0

感谢您的帮助! – Haffi112

+0

对我来说,当我将{follow:True}添加到针中的选项时,它工作正常。这使差异:) – Haffi112