Skip to content

Instantly share code, notes, and snippets.

@pste
Created August 31, 2017 13:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pste/57aada585ed37ff8bb12b59cb21c7d10 to your computer and use it in GitHub Desktop.
Save pste/57aada585ed37ff8bb12b59cb21c7d10 to your computer and use it in GitHub Desktop.
Node.js DOM parsing with promises
var request = require('request');
var jsdom = require('jsdom');
var promise = require('promise');
var colors = require('colors');
var util = require('util');
function get(url) {
return new Promise(function (resolve, reject) {
console.log('>>>'.yellow, 'started', 'get'.cyan, '[', url.yellow, ']');
request(url, function(err, res, body) {
if (!err && res.statusCode == 200) {
console.log('>>>'.yellow, 'done'.green, 'get'.cyan, '[', url.yellow, ']');
resolve(body);
}
else {
console.log('get error:'.red);
if (res && res.statusCode) console.log(' res:' + util.inspect(res.statusCode));
console.log(' err:' + util.inspect(err));
console.log('- - - - -'.red);
reject(err);
}
});
});
}
function buildDOM(body) {
return new Promise(function (resolve, reject) {
console.log('>>>'.yellow, 'started', 'buildDOM'.cyan, 'on', body.length, 'bytes');
jsdom.env(body, ["http://code.jquery.com/jquery.js"], function(err, window) {
if (typeof(window) === 'undefined') {
console.log('buildDOM Error'.red + ': ' + util.inspect(err));
reject(err);
}
else {
console.log('>>>'.yellow, 'done'.green, 'buildDOM'.cyan);
resolve(window.$);
}
}
);
});
}
function parse($) {
return new Promise(function (resolve, reject) {
console.log('>>>'.yellow, 'started', 'parse'.cyan);
try {
var result = $('input[name="btnI"]');
console.log('>>>'.yellow, 'done'.green, 'parse'.cyan);
resolve(result.attr('value'));
}
catch (ex) {
console.log('Parse Error'.red, util.inspect(err));
reject(ex);
}
});
}
function log(x) {
console.log('>>>'.yellow, 'started', 'logging'.cyan);
console.log('[',x,']');
console.log('>>>'.yellow, 'done'.green, 'logging'.cyan);
}
get('http://www.google.com').then(buildDOM).then(parse).then(log);
const request = require('request');
const jsdom = require("jsdom");
const { JSDOM } = jsdom;
const jquery = require('jquery');
const util = require('util');
function get(url) {
return new Promise(function (resolve, reject) {
console.log('>>>', 'started', 'get', '[', url, ']');
request(url, function(err, res, body) {
if (!err && res.statusCode == 200) {
console.log('>>>', 'done', 'get', '[', url, ']');
resolve(body);
}
else {
console.log('get error:');
if (res && res.statusCode) console.log(' res:' + util.inspect(res.statusCode));
console.log(' err:' + util.inspect(err));
console.log('- - - - -');
reject(err);
}
});
});
}
function buildDOM(body) {
return new Promise(function (resolve, reject) {
console.log('>>> started buildDOM on', body.length, 'bytes');
var dom = new JSDOM(body);
var $ = jquery(dom.window);
console.log('>>>', 'done', 'buildDOM');
resolve($);
});
}
function parse($) {
return new Promise(function (resolve, reject) {
console.log('>>>', 'started', 'parse');
try {
var result = $('input[name="btnI"]');
console.log('>>>', 'done', 'parse');
resolve(result.attr('value'));
}
catch (ex) {
console.log('Parse Error', util.inspect(err));
reject(ex);
}
});
}
function log(x) {
console.log('>>>', 'started', 'logging');
console.log('[',x,']');
console.log('>>>', 'done', 'logging');
}
get('http://www.google.com').then(buildDOM).then(parse).then(log);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment