2016-07-27 2 views
-1

私はNode.jsとCheerioで使用しているhereの次のコードを使って、htmlファイルを読み込んで大きなソースファイルを小さな塊に分割しています。コードは1つのファイルに対してうまく機能しています。Node.js fs cheerio複数のファイルを読み書きします

今では、複数の大きなhtmlファイルを読み込み、順番に分割して結果ファイルをフォルダに出力する必要があります。 フォルダ内のすべてのファイルを読み書きして分割するにはどうすればよいですか?ここで

コードです:ここでは

var cheerio = require('cheerio'), 
    fs = require('fs'); 

fs.readFile('./sourceHtml2/testone.html', 'utf8', dataLoaded); 

function dataLoaded(err, data) { 

    $ = cheerio.load(data); 


    $('#toplevel > div').each(function (i, elem) { 

    var id = $(elem).attr('id'), 

     filename = id + '.html', 
     content = $.html(elem); 

    fs.writeFile('./output2/' + filename, content, function (err) { 

     console.log('Written html to ' + filename); 
    }); 
    }); 
} 

は私のサンプルのソースファイル

<!DOCTYPE html SYSTEM "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
    <title>Lorem Ipsum</title> 
    </head> 
    <body> 
    <div id="toplevel"> 
     <div id="1-1"> 
     <h1>HTML Ipsum Presents One</h1> 
     <p> 
     <strong>Pellentesque habitant morbi tristique</strong>senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. 

     <h2>Header Level 2</h2> 
     <ol> 
      <li>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</li> 
      <li>Aliquam tincidunt mauris eu risus.</li> 
     </ol> 
     <h3>Header Level 3</h3> 
     <ul> 
      <li>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</li> 
      <li>Aliquam tincidunt mauris eu risus.</li> 
     </ul> 
     </div> 
     <div id="1-2"> 
     <h1>HTML Ipsum Presents Two</h1> 
     <p> 
     <strong>Pellentesque habitant morbi tristique</strong>senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. 

     <h2>Header Level 2</h2> 
     <ol> 
      <li>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</li> 
      <li>Aliquam tincidunt mauris eu risus.</li> 
     </ol> 
     <blockquote> 
      <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus magna. Cras in mi at felis aliquet congue. Ut a est eget ligula molestie gravida. Curabitur massa. Donec eleifend, libero at sagittis mollis, tellus est malesuada tellus, 
      at luctus turpis elit sit amet quam. Vivamus pretium ornare est.</p> 
     </blockquote> 
     <h3>Header Level 3</h3> 
     <ul> 
      <li>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</li> 
      <li>Aliquam tincidunt mauris eu risus.</li> 
     </ul> 
     </div> 
     <div id="1-3"> 
     <h1>HTML Ipsum Presents Three</h1> 
     <p> 
     <strong>Pellentesque habitant morbi tristique</strong>senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. 

     <h2>Header Level 2</h2> 
     <ol> 
      <li>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</li> 
      <li>Aliquam tincidunt mauris eu risus.</li> 
     </ol> 
     <blockquote> 
      <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus magna. Cras in mi at felis aliquet congue. Ut a est eget ligula molestie gravida. Curabitur massa. Donec eleifend, libero at sagittis mollis, tellus est malesuada tellus, 
      at luctus turpis elit sit amet quam. Vivamus pretium ornare est.</p> 
     </blockquote> 
     <h3>Header Level 3</h3> 
     <ul> 
      <li>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.</li> 
      <li>Aliquam tincidunt mauris eu risus.</li> 
     </ul> 
     </div> 
    </div> 
    </body> 
</html> 

であるあなたのヘルプは大歓迎されます。

+0

[ 'fs.readdir'](https://nodejs.org/api/fs.html#fs_fs_readdir_path_options_callback)を見てみましょう。それはあなたがフォルダ内のすべてのファイルの配列を取得することができます、あなたはその配列を反復して、あなたの関数に渡すことができるはずです。 –

答えて

1

入力ディレクトリのファイルを配列として処理する必要があります。また、出力フォルダ内のファイル名の衝突を防ぐ必要があります。

次のコードは、両方の問題の解決方法を示しています。 HTMLファイル(.htmと.html)は 'input'サブフォルダから読み込まれ、生成されたファイルは 'output'サブフォルダに書き込まれます。

var cheerio = require('cheerio'), 
    fs = require('fs'); 

// process files found in the 'input' folder 
fs.readdir('./input', 'utf8', findHtmlFiles); 

function findHtmlFiles(err, files) { 

    if (files.length) { 
     files.forEach(function (fullFilename) { 
      var pattern = /\.[0-9a-z]{1,5}$/i; 
      var ext = (fullFilename).match(pattern); 
      // only process '.htm' and '.html' files 
      if (ext[0] == '.htm' || ext[0] == '.html') { 
       fs.readFile('./input/' + fullFilename, 'utf8', function (err, data) { 
        if (err) 
         throw err 
        else { 
         // add the file name to prevent collisions 
         // in the output folder 
         var fileData = { 
          file: fullFilename.slice(0, (ext[0].length * -1)), 
          data: data 
         }; 
         dataLoaded(null, fileData); 
        } 
       }); 
      } 
     }); 
    } 

} 

function dataLoaded(err, fd) { 

    $ = cheerio.load(fd.data); 

    $('#toplevel > div').each(function (i, elem) { 

     var id = $(elem).attr('id'), 
      filename = fd.file + '_' + id + '.html', 
      content = $.html(elem); 

     fs.writeFile('./output/' + filename, content, function (err) { 

      console.log('Written html to ' + filename); 
     }); 
    }); 
} 

サンプルコンソール出力:

Written html to testone_1-1.html 
Written html to testone_1-2.html 
Written html to testone_1-3.html 
Written html to testtwo_1-1.html 
Written html to testtwo_1-2.html 
Written html to testtwo_1-3.html 
+0

Dan Nagleに感謝します。それは美しく働いた。 – EBamba

関連する問題