123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523 |
- // 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
- function traiteFichierC(formalfile) {
- // fonction de scraping des fichiers c*.html
- var html = fs.readFileSync(formalfile, "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 des fichiers c
- // traitement des fichiers douying
- function traiteFichierDouying(formalfile) {
- var html = fs.readFileSync(formalfile, "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("p .english").text();
- // 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("p .pinyin").text();
- pinyin = pinyin.toLowerCase();
- // phraseObj.phrase.pinyin = pinyinizer.pinyinize(pinyin);
- // on va tester ça ...
- try {
- phraseObj.phrase.pinyin = pinyinizer.pinyinize(pinyin);
- }
- catch(err) {
- console.log("Erreur: " + pinyin);
- 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");
- 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 des fichiers douying
- // traitement de fichiers douzhong
- function traiteFichierDouzhong(formalfile) {
- var html = fs.readFileSync(formalfile, "UTF-8");
- dom = new JSDOM(html);
- var $ = require('jquery')(dom.window);
- // on traite les ul
- var $z = dom.window.$("ul input").parent().each(function(index, element) {
- //DEBUG console.log("numéro élément: " + index);
- // le topic
- phraseObj.phrase.topic = topic;
- var ligneCSV = "";
- var csv1 = "";
- var csv2 = "";
-
- //DEBUG console.log("*****************");
- // le hanzi
- var hanzi = $(element).find("font:first").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 et les explications
- var secondul = $(element).find("ul:first");
- var jumeaux = $(secondul).find("font").siblings();
- var pinyin = $(jumeaux).first().text();
- var anglais = $(jumeaux).next("font:first").text();
- var explications = $(secondul).find("ul").text().trim();
- // l'anglais
- var translationObj = {
- "translation": {}
- };
- translationObj.translation.langue = "en";
- translationObj.translation.texte = anglais;
- phraseObj.phrase.translations.push(translationObj);
- // le pinyin
- // le pinyin que l'on transforme d'une version avec chiffres à une version avec accents
- pinyin = pinyin.toLowerCase();
- try {
- phraseObj.phrase.pinyin = pinyinizer.pinyinize(pinyin);
- }
- catch(err) {
- console.log("Erreur: " + pinyin);
- phraseObj.phrase.pinyin = pinyin;
- }
- // on continue à construire la ligne csv
- csv1 = csv1 + phraseObj.phrase.pinyin + tab + anglais + tab + explications + tab;
- // DEBUG console.log(csv1);
- // traitement des enregistrements ... chinois et anglais
- // le chinois :) et l'anglais ...
- var $x = $(secondul).find("a[href]").each(function(index, element) {
- var $b = $(element).find("img[SRC='../tingsmgl.jpg']");
- if ($b.length == 1) {
- // DEBUGconsole.log(index, $b);
- // DEBUGconsole.log($(element).attr("href"));
- // DEBUGconsole.log($(element).text());
- var recordingObject = {
- "recording": {}
- };
- recordingObject.recording.langue = "zh";
- recordingObject.recording.locuteur = $(element).text().trim();
- recordingObject.recording.audio = $(element).attr("href");
- 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);
- maineeduObj.maineedu.push(phraseObj);
- var ele = feed.ele(phraseObj);
- reset(phraseObj);
- }
- })
- }
- );
- }
- // 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
- fichierCourant = path.join(repertoireInitial, repertoireCourant, "douzhong.html");
- console.log(fichierCourant);
- traiteFichierDouying(fichierCourant);
- }
- } else {
- // traitement des douying
- fichierCourant = path.join(repertoireInitial, repertoireCourant,"douying.html" );
- console.log(fichierCourant);
- traiteFichierDouzhong(fichierCourant);
- }
- } else {
- // traitement des fichiers c
- fichiers.forEach(function(fffile) {
- fichierCourant = path.join(repertoireInitial, repertoireCourant, fffile);
- // DEBUG
- console.log(fichierCourant);
- traiteFichierC(fichierCourant);
- });
- }
- };
- });
- // 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));
|