123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281 |
- // programme de scraping des données de Maine.edu
- // douzhong
- var jsdom = require("jsdom");
- const {
- JSDOM
- } = jsdom;
- const fs = require("fs");
- var argv = require("optimist").argv;
- const sq = require("better-sqlite3");
- const pinyinizer = require('pinyinizer');
- const builder = require('xmlbuilder');
- const opencc = require('node-opencc');
- // données de stockage
- var fichier = argv._[0];
- var fichierXml = "datas.xml";
- var fichierJson = "datas.json";
- var baseDeDonnées = "datas.db";
- var fichierCSV = "datas.csv";
- // données en mémoire
- // le fichier complet en mémoire
- var maineeduObj = {
- "maineedu": []
- };
- var phraseObj = {
- "phrase": {
- "topic": "",
- "hanzi": {
- "simplified": "",
- "traditional": ""
- },
- "pinyin": "",
- "explications": "",
- "translations": [],
- "recordings": []
- }
- }
- // fichier des locuteurs
- var locuteurs = [];
- // un locuteur
- var locuteur = {
- "nom": "",
- "langue": ""
- }
- var tab = "\t";
- var endLine = "\n";
- // 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);
- var html = fs.readFileSync(fichier, "UTF-8");
- dom = new JSDOM(html);
- var $ = require('jquery')(dom.window);
- function reset(p) {
- phraseObj = {
- "phrase": {
- "topic": "",
- "hanzi": {
- "simplified": "",
- "traditional": ""
- },
- "pinyin": "",
- "explications": "",
- "translations": [],
- "recordings": []
- }
- }
- }
- // fonction de scraping des fichiers c*.html
- // on traite le topic
- var $header = $.find("title");
- console.log("Le header est: " + $($header).text() + "\n\n");
- var topic = $($header).text();
- // 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);
- }
- })
- }
- );
- // // 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 .sans_serif").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);
- // });
- // on ferme le fichier CSV
- csv.end();
- // on écrit le fichier Json
- fs.writeFileSync(fichierJson, JSON.stringify(maineeduObj), "UTF-8");
- // DEBUG console.log(JSON.stringify(maineedu));
- // on écrit le fichier xml
- fs.writeFileSync(fichierXml, feed.end({
- pretty: true
- }));
|