// programme de scraping des données de Maine.edu var jsdom = require("jsdom"); const { JSDOM } = jsdom; // librairie de gestion des répertoires et fichiers const fs = require("fs"); const path = require("path"); // librairie de gestion des arguments de la ligne de commande var argv = require("optimist").argv; // librairie base de données sqlite const sq = require("better-sqlite3"); // librairie de traitement du pinyin const pinyinizer = require('pinyinizer'); // librairie de gestion des fichiers xml const builder = require('xmlbuilder'); // librairie de gestion du hanzi const opencc = require('node-opencc'); // temporaire var prompt = require('prompt'); prompt.start(); // // données de stockage var fichierXml = "MaineEdu-datas.xml"; var fichierJson = "MaineEdu-datas.json"; var baseDeDonnées = "MaineEdu-datas.db"; var fichierCSV = "MaineEdu-datas.csv"; // données en mémoire // le fichier complet en mémoire var maineeduObj = { "maineedu": [] }; var phraseObj = { "phrase": { "topic": "", "hanzi": { "simplified": "", "traditional": "" }, "pinyin": "", "translations": [], "recordings": [] } } // fichier des locuteurs var locuteurs = []; // un locuteur var locuteur = { "nom": "", "langue": "" } var tab = "\t"; var endLine = "\n"; // fin des données en mémoire // données calculées var repertoireInitial = ""; var repertoireCourant = ""; var fichierCourant = ""; // fin des données calculées // fonctions utilitaires // reset d'un enregistrement function reset(p) { phraseObj = { "phrase": { "topic": "", "hanzi": { "simplified": "", "traditional": "" }, "pinyin": "", "translations": [], "recordings": [] } } } // fin du reste d'un enregistrement // détermination du répertoire de travail et mise à jour des variables repertoireInitial = path.resolve(path.join("./",argv._[0])); // DEBUG // console.log("réperoire initial:", repertoireInitial); // OK fichierXml = path.join(repertoireInitial,"MaineEdu-datas.xml"); fichierJson = path.join(repertoireInitial,"MaineEdu-datas.json"); baseDeDonnées = path.join(repertoireInitial,"MaineEdu-datas.db"); fichierCSV = path.join(repertoireInitial,"MaineEdu-datas.csv"); // DEBUG // console.log(fichierXml," ",fichierJson, " ",baseDeDonnées, " ",fichierCSV); // OK // fin de la détermination du répertoire de travail // fin des fonctions utilitaires // fonctions de traitement des fichiers html, c. douying et douzhong // traitement des fichiers c // fin du traitement des fichiers c // traitement des fichiers douying // fin du traitement des fichiers douying // traitement de fichiers douzhong // fin du traitement des fichiers douzhong // fin du traitement des fichiers html // on crée le fichier xml var feed = builder.create('maineedu', { version: '1.0', encoding: 'UTF-8', standalone: true }); // on crée le fichier csv var csv = fs.createWriteStream(fichierCSV); // on parcours l'arborescence var repertoires = fs.readdirSync(repertoireInitial); repertoires.forEach(function(repertoire) { // gestion des répertoires repertoire = path.join(repertoireInitial,repertoire); // DEBUG console.log("%s", repertoire); // OK if (fs.statSync(repertoire).isDirectory()) { // On traite chaque répertoire // DEBUG console.log("%s", repertoire); // OK repertoireCourant = path.basename(repertoire); // DEBUG console.log(repertoireCourant); // OK // Recherche des fichiers c*.html ffiles = fs.readdirSync(repertoire); var fichiers = ffiles.filter((ffile) => ffile[0] == "c" ); // DEBUG console.log( repertoireCourant, " ", fichiers); if (fichiers == "") { // console.log("pas de fichiers c"); fichiers = ffiles.filter((ffile) => ffile == "douying.html" ); // DEBUG console.log( repertoireCourant, " ", fichiers); if (fichiers == "") { // console.log("pas de fichiers douying"); fichiers = ffiles.filter((ffile) => ffile == "douzhong.html" ); // DEBUG console.log( repertoireCourant, " ", fichiers); if (fichiers != "") { // traitement des douzhong } } else { // traitement des douying } } else { // traitement des fichiers c fichiers.forEach(function(fffile) { fichierCourant = path.join(repertoireInitial, repertoireCourant, fffile); // DEBUG console.log(fichierCourant); //************************* traitement de chaque fichier // fonction de scraping des fichiers c*.html var html = fs.readFileSync(fichierCourant, "UTF-8"); dom = new JSDOM(html); var $ = require('jquery')(dom.window); // on traite le topic var $header = $.find("#header H1"); // DEBUG console.log("Le header est: " + $($header).text()); var topic = $($header).text(); // on traite les "rows" $z = dom.window.$(".row ").each(function(index, element) { // le topic phraseObj.phrase.topic = topic; var ligneCSV = ""; var csv1 = ""; var csv2 = ""; //traitement des données textuelles : Hanzi, Pinyin et traduction en anglais //c'est la seule partie qui change entre les différents fichiers. // on retrouve le texte en chinois // DEBUG console.log("index: " + index + " texte en hanzi: " + $(element).find("p .chinese").text()); var hanzi = $(element).find("p .chinese").text(); var traditional = opencc.simplifiedToTraditional(hanzi); phraseObj.phrase.hanzi.simplified = hanzi; phraseObj.phrase.hanzi.traditional = traditional; csv1 = hanzi + tab + traditional + tab; // on retrouve le texte en anglais et pinyin // DEBUG console.log("texte en pinyin et traduction en anglais"); // l'anglais var anglais = $(element).find(".indented img:first").attr("title"); // DEBUG console.log(anglais); var translationObj = { "translation": {} }; translationObj.translation.langue = "en"; translationObj.translation.texte = anglais; phraseObj.phrase.translations.push(translationObj); // le pinyin que l'on transforme d'une version avec chiffres à une version avec accents var pinyin = $(element).find(".indented img:nth-child(2)").attr("title"); pinyin = pinyin.toLowerCase(); // on va tester ça ... try { phraseObj.phrase.pinyin = pinyinizer.pinyinize(pinyin); } catch(err) { console.log("Erreur: " + pinyin); phraseObj.phrase.pinyin = pinyin; } // modif pour court-circuiter pinyinise //phraseObj.phrase.pinyin = pinyin; csv1 = csv1 + phraseObj.phrase.pinyin + tab + anglais + tab; // DEBUG $(element).find(".indented img").each(function(index, letexte) { // console.log("---->" + $(this).attr("title")); // }); // // traitement des données audio en anglais et en chinois // // on retrouve les enregistrements var $t = $(element).find(".speech_samples:first"); // // prononctation en chinois // DEBUG console.log("--> Prononciation en chinois"); $t.find("tr:first td a:nth-child(2)").each(function(index, audio) { // DEBUG console.log("--> " + index + " " + $(this).text() + " " + $(this).attr("href")); var recordingObject = { "recording": {} }; recordingObject.recording.langue = "zh"; recordingObject.recording.locuteur = $(this).text(); recordingObject.recording.audio = $(this).attr("href"); // transformation de l'url du fichier son: ../../Language/Sound19b/19103sjx.wav => [sound:MaineEdu-19103sjx.mp3] var xx = recordingObject.recording.audio; xx = path.basename(xx,".wav"); xx = "[sound:MaineEdu-" + xx + ".mp3]"; recordingObject.recording.audio = xx; // fin de transformation phraseObj.phrase.recordings.push(recordingObject); // on crée la ligne csv à écrire dans le fichier csv2 = recordingObject.recording.locuteur + tab + recordingObject.recording.audio; ligneCSV = csv1 + csv2 + tab + topic + tab + "MaineEdu" + endLine; csv.write(ligneCSV); }); // prononciation en anglais // DEBUG console.log("--> Prononciation en anglais"); $t.find("tr:nth-child(2) td a:nth-child(2)").each(function(index, audio) { // DEBUG console.log("--> " + index + " " + $(this).text() + " " + $(this).attr("href")); var recordingObject = { "recording": {} }; recordingObject.recording.langue = "en"; recordingObject.recording.locuteur = $(this).text(); recordingObject.recording.audio = $(this).attr("href"); phraseObj.phrase.recordings.push(recordingObject); }); // DEBUG console.log(JSON.stringify(phraseObj)); maineeduObj.maineedu.push(phraseObj); var ele = feed.ele(phraseObj); reset(phraseObj); }); //************************* fin du traitement de chaque fichier }); } }; }); // fin du parcours de l'arborescence // on ferme le fichier CSV csv.end(); // on écrit le fichier xml fs.writeFileSync(fichierXml, feed.end({ pretty: true })); // on écrit le fichier Json fs.writeFileSync(fichierJson, JSON.stringify(maineeduObj), "UTF-8"); // DEBUG console.log(JSON.stringify(maineeduObj));