如何使用jsdom从文件中获取DOM?
我正在使用Node.js,它的插件请求和FS来保存我的硬盘上的网页。 这是通过以下代码完成的:
function loadURL(url, file_path, handler) { request.get(url).on('error', (error) => handler(error)).pipe(fs.createWriteStream(file_path, {'flags' : 'w'})) }
现在,我想通过Node.JS插件JSDOM从本地文件获取HTML DOM。
因此:
- 我必须阅读这个文件感谢插件FS;
- 当读取所有文件的HTML代码时,我必须将后者存储为一个string;
- 最后,我必须调用:
jsdom.jsdom(the_string_containing_HTML_code)
。
步骤3很简单。 第二也许。 但是…我怎么能asynchronous读取本地文件使用FS? read
function不应按照文件使用; 相反,我应该使用pipe
…但后者只是将一个WritableStream
到一个ReadableStream
…它不能满足我想要的。
注意:我真的想要使用asynchronous方法。
对于你的用例(AFAIK), fs.readFile()是完全可以接受的。 该方法是asynchronous的。 同步和不明智的方法称为fs.readFileSync()。
我build议使用不处理stream的请求的调用,但只是返回一个数据的callback:
function loadURL(url, file_path, handler) { request.get(url,(error,response,body) => { if (error) { handler(error,null); } fs.writeFile(file_path,body,'utf8',(err) => { if (err) { handler(err,null); } // now you can safely assume your file is written to disk // you still have $body in memory, but let's pretend you don't // for sake of this exersise fs.readFile(file_path,'utf8',(err,html) => { if (err) handler(err,null); jsdom.env(html,(err,window) => { if (err) handler(err,null); // SUCCESS! handler(null,window); }); }); }); }); }
这将工作在低成本的工作量。 如果你想要更细致的控制stream,stream是好的。 但我build议先尝试这种方式。
这段代码假设handler()有签名handler(err,window)