我显然是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 00: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 01: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 00: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
复制相似问题