我显然是Javascript的新手,我不愿意承认这一点。我正在尝试使用Node.js拉取一个网页,并将其内容保存为一个变量,这样我就可以随心所欲地解析它。
在Python中,我会这样做:
from bs4 import BeautifulSoup # for parsing
import urllib
text = urllib.urlopen("http://www.myawesomepage.com/").read()
parse_my_awesome_html(text)我该如何在Node中做到这一点?我已经做到了:
var request = require("request");
request("http://www.myawesomepage.com/", function (error, response, body) {
    /*
     Something here that lets me access the text
     outside of the closure
     This doesn't work:
     this.text = body;
    */ 
})发布于 2012-07-07 08:46:16
var request = require("request");
var parseMyAwesomeHtml = function(html) {
    //Have at it
};
request("http://www.myawesomepage.com/", function (error, response, body) {
    if (!error) {
        parseMyAwesomeHtml(body);
    } else {
        console.log(error);
    }
});编辑:正如Kishore所说,有很好的解析选项可用。如果你在windows上遇到了jsdom的python/gyp问题,也可以看看cheerio。Cheerio on github
发布于 2012-07-07 09:36:48
该request()调用是异步的,因此该响应仅在回调中可用。你必须从它调用你的解析函数:
function parse_my_awesome_html(text){
    ...
}
request("http://www.myawesomepage.com/", function (error, response, body) {
    parse_my_awesome_html(body)
})习惯于链接回调,这基本上就是javascript中任何I/O发生的方式:)
发布于 2012-07-07 08:42:17
如果你想解析响应,JsDom可以很好地实现这样的功能。
    var request = require('request'),
    jsdom = require('jsdom');
request({ uri:'http://www.myawesomepage.com/' }, function (error, response, body) {
  if (error && response.statusCode !== 200) {
    console.log('Error when contacting myawesomepage.com')
  }
  jsdom.env({
    html: body,
    scripts: [
      'http://code.jquery.com/jquery-1.5.min.js'
    ]
  }, function (err, window) {
    var $ = window.jQuery;
    // jQuery is now loaded on the jsdom window created from 'agent.body'
    console.log($('body').html());
  });
});另外,如果您的页面加载了大量javascript/ajax内容,则可能需要考虑使用phantomjs源http://blog.nodejitsu.com/jsdom-jquery-in-5-lines-on-nodejs/
https://stackoverflow.com/questions/11371310
复制相似问题