myapp.js 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. // programme de scraping des données de Maine.edu
  2. // C*
  3. var jsdom = require("jsdom");
  4. const {
  5. JSDOM
  6. } = jsdom;
  7. const fs = require("fs");
  8. var argv = require("optimist").argv;
  9. const sq = require("better-sqlite3");
  10. const pinyinizer = require('pinyinizer');
  11. const builder = require('xmlbuilder');
  12. const opencc = require('node-opencc');
  13. // données de stockage
  14. var fichier = argv._[0];
  15. var fichierXml = "datas.xml";
  16. var fichierJson = "datas.json";
  17. var baseDeDonnées = "datas.db";
  18. var fichierCSV = "datas.csv";
  19. // données en mémoire
  20. // le fichier complet en mémoire
  21. var maineeduObj = {
  22. "maineedu": []
  23. };
  24. var phraseObj = {
  25. "phrase": {
  26. "topic": "",
  27. "hanzi": {
  28. "simplified": "",
  29. "traditional": ""
  30. },
  31. "pinyin": "",
  32. "translations": [],
  33. "recordings": []
  34. }
  35. }
  36. // fichier des locuteurs
  37. var locuteurs = [];
  38. // un locuteur
  39. var locuteur = {
  40. "nom": "",
  41. "langue": ""
  42. }
  43. var tab = "\t";
  44. var endLine = "\n";
  45. // on crée le fichier xml
  46. var feed = builder.create('maineedu', {
  47. version: '1.0',
  48. encoding: 'UTF-8',
  49. standalone: true
  50. });
  51. // on crée le fichier csv
  52. var csv = fs.createWriteStream(fichierCSV);
  53. var html = fs.readFileSync(fichier, "UTF-8");
  54. dom = new JSDOM(html);
  55. var $ = require('jquery')(dom.window);
  56. function reset(p) {
  57. phraseObj = {
  58. "phrase": {
  59. "topic": "",
  60. "hanzi": {
  61. "simplified": "",
  62. "traditional": ""
  63. },
  64. "pinyin": "",
  65. "translations": [],
  66. "recordings": []
  67. }
  68. }
  69. }
  70. // fonction de scraping des fichiers c*.html
  71. // on traite le topic
  72. var $header = $.find("#header H1");
  73. // DEBUG console.log("Le header est: " + $($header).text());
  74. var topic = $($header).text();
  75. // on traite les "rows"
  76. $z = dom.window.$(".row ").each(function(index, element) {
  77. // le topic
  78. phraseObj.phrase.topic = topic;
  79. var ligneCSV = "";
  80. var csv1 = "";
  81. var csv2 = "";
  82. //traitement des données textuelles : Hanzi, Pinyin et traduction en anglais
  83. //c'est la seule partie qui change entre les différents fichiers.
  84. // on retrouve le texte en chinois
  85. // DEBUG console.log("index: " + index + " texte en hanzi: " + $(element).find("p .chinese").text());
  86. var hanzi = $(element).find("p .chinese").text();
  87. var traditional = opencc.simplifiedToTraditional(hanzi);
  88. phraseObj.phrase.hanzi.simplified = hanzi;
  89. phraseObj.phrase.hanzi.traditional = traditional;
  90. csv1 = hanzi + tab + traditional + tab;
  91. // on retrouve le texte en anglais et pinyin
  92. // DEBUG console.log("texte en pinyin et traduction en anglais");
  93. // l'anglais
  94. var anglais = $(element).find(".indented img:first").attr("title");
  95. // DEBUG console.log(anglais);
  96. var translationObj = {
  97. "translation": {}
  98. };
  99. translationObj.translation.langue = "en";
  100. translationObj.translation.texte = anglais;
  101. phraseObj.phrase.translations.push(translationObj);
  102. // le pinyin que l'on transforme d'une version avec chiffres à une version avec accents
  103. var pinyin = $(element).find(".indented img:nth-child(2)").attr("title");
  104. pinyin = pinyin.toLowerCase();
  105. phraseObj.phrase.pinyin = pinyinizer.pinyinize(pinyin);
  106. csv1 = csv1 + phraseObj.phrase.pinyin + tab + anglais + tab;
  107. // DEBUG $(element).find(".indented img").each(function(index, letexte) {
  108. // console.log("---->" + $(this).attr("title"));
  109. // });
  110. // // traitement des données audio en anglais et en chinois
  111. // // on retrouve les enregistrements
  112. var $t = $(element).find(".speech_samples:first");
  113. // // prononctation en chinois
  114. // DEBUG console.log("--> Prononciation en chinois");
  115. $t.find("tr:first td a:nth-child(2)").each(function(index, audio) {
  116. // DEBUG console.log("--> " + index + " " + $(this).text() + " " + $(this).attr("href"));
  117. var recordingObject = {
  118. "recording": {}
  119. };
  120. recordingObject.recording.langue = "zh";
  121. recordingObject.recording.locuteur = $(this).text();
  122. recordingObject.recording.audio = $(this).attr("href");
  123. phraseObj.phrase.recordings.push(recordingObject);
  124. // on crée la ligne csv à écrire dans le fichier
  125. csv2 = recordingObject.recording.locuteur + tab + recordingObject.recording.audio;
  126. ligneCSV = csv1 + csv2 + tab + topic + tab + "MaineEdu" + endLine;
  127. csv.write(ligneCSV);
  128. });
  129. // prononciation en anglais
  130. // DEBUG console.log("--> Prononciation en anglais");
  131. $t.find("tr:nth-child(2) td a:nth-child(2)").each(function(index, audio) {
  132. // DEBUG console.log("--> " + index + " " + $(this).text() + " " + $(this).attr("href"));
  133. var recordingObject = {
  134. "recording": {}
  135. };
  136. recordingObject.recording.langue = "en";
  137. recordingObject.recording.locuteur = $(this).text();
  138. recordingObject.recording.audio = $(this).attr("href");
  139. phraseObj.phrase.recordings.push(recordingObject);
  140. });
  141. // DEBUG console.log(JSON.stringify(phraseObj));
  142. maineeduObj.maineedu.push(phraseObj);
  143. var ele = feed.ele(phraseObj);
  144. reset(phraseObj);
  145. });
  146. // on ferme le fichier CSV
  147. csv.end();
  148. // on écrit le fichier Json
  149. fs.writeFileSync(fichierJson, JSON.stringify(maineeduObj), "UTF-8");
  150. // DEBUG console.log(JSON.stringify(maineedu));
  151. // on écrit le fichier xml
  152. fs.writeFileSync(fichierXml, feed.end({
  153. pretty: true
  154. }));