Node.js保存GET请求的HTML响应

时间:2012-07-07 00:31:49

标签: node.js request

我显然比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;
    */ 
})

3 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:3)

request()调用异步,因此响应仅在回调中可用。你必须从它调用你的解析函数:

function parse_my_awesome_html(text){
    ...
}

request("http://www.myawesomepage.com/", function (error, response, body) {
    parse_my_awesome_html(body)
})

习惯链接回调,这实际上是javascript中I / O的发生方式:)

答案 2 :(得分:2)

如果要解析响应,

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/