使用请求包在 nodejs 中抓取和解析 html 的最佳方法
Best way to scrape and parse html in nodejs with request package
我注意到,在我的实验过程中,我无法使用 htmlparser 或 htmlparser2 包解析从 request.get 收到的文本。
与 https.request 相比,返回的字符串不一样,明智地换行。我正在抓取一个人类可读的页面,并且 http.request 处理程序能够聚合数据以在输出方面匹配服务器响应。
但是 request.get 我收到了没有换行符的回复。
因此我只能假设我没有使用 requestjs 不支持的解析包,并导致问题:
实际解析从 reqeust.get 和 requst.post 调用中收到的 HTML 的最佳方法是什么?
谢谢。
抱歉,我使用的是响应而不是正文,正确的方法是:
var request = require('request');
var htmlparser = require('htmlparser2');
var select = require('soupselect').select
var url = '';
function httpsHandler(err, response, body) {
if(err){
console.error('to err is human')
process.exit(1);
}
var parser = new htmlparser.Parser(htmlHandler);
parser.parseComplete(body);
}
var htmlHandler = new htmlparser.DefaultHandler( (error, dom) => {
if (error){
console.log( 'error', error );
process.exit(1);
}
var options = extractData( dom );
});
function extractData( dom ){
var collection = select(dom, '#ctl00_LeftColumnMiddle_Table1 table td');
collection.forEach( ( licenses ) => {
licenses.children.forEach( ( license, i ) => {
var data = ( license.data ) ? license.data : license.children[0].data
console.log( data );
});
})
}
//entry point
request.get( url , httpsHandler );
我注意到,在我的实验过程中,我无法使用 htmlparser 或 htmlparser2 包解析从 request.get 收到的文本。
与 https.request 相比,返回的字符串不一样,明智地换行。我正在抓取一个人类可读的页面,并且 http.request 处理程序能够聚合数据以在输出方面匹配服务器响应。
但是 request.get 我收到了没有换行符的回复。 因此我只能假设我没有使用 requestjs 不支持的解析包,并导致问题:
实际解析从 reqeust.get 和 requst.post 调用中收到的 HTML 的最佳方法是什么?
谢谢。
抱歉,我使用的是响应而不是正文,正确的方法是:
var request = require('request');
var htmlparser = require('htmlparser2');
var select = require('soupselect').select
var url = '';
function httpsHandler(err, response, body) {
if(err){
console.error('to err is human')
process.exit(1);
}
var parser = new htmlparser.Parser(htmlHandler);
parser.parseComplete(body);
}
var htmlHandler = new htmlparser.DefaultHandler( (error, dom) => {
if (error){
console.log( 'error', error );
process.exit(1);
}
var options = extractData( dom );
});
function extractData( dom ){
var collection = select(dom, '#ctl00_LeftColumnMiddle_Table1 table td');
collection.forEach( ( licenses ) => {
licenses.children.forEach( ( license, i ) => {
var data = ( license.data ) ? license.data : license.children[0].data
console.log( data );
});
})
}
//entry point
request.get( url , httpsHandler );