Page 1 sur 2 12 DernièreDernière
Résultats de 1 à 10 sur 17

Sujet : html => txt

  1. #1
    Membre MP
    Inscrit
    août 2013
    Messages
    15

    html => txt

    Salut à tous,

    Je cherche une classe qui permettrait à partir d\'un fichier .html d\'obtenir le fichier.txt correspondant (sans aucune mise en page particulière, éventuellement en conservant les retours à la ligne et évidemment sans les balises). Le top serait même d\'obtenir directement un BufferedReader sans avoir à réécrire le fichier.
    Ca doit bien exister mais j\'ai rien trouvé. Qqn aurait-il un outil miracle ou faut-il le fabriquer soi-même ?

  2. #2
    Membre MP
    Inscrit
    août 2013
    Messages
    1 823
    Au plus 30 lignes pour faire le travail. Ca c\'est un super jeux !

    Si tu veux on fait un concour.
    Celui qui sort le fichier avec le moins de lignes de code. (lisible bien sur!) et le plus vite aussi.

    30 lignes et je suis large. Si tu accepte le chalenge on prend cette page pour reference.

    Je veux bien ecrire les lignes du bench si il faux, pour departager le gagnant.

    C\'est une proposition serieuse, pour moi c pas un probleme alors si tu veux on partage la soluce de l\'autre a la fin mais tu montre ton code en premier histoire de pas se moquer de moi :wink:

  3. #3
    Membre MP
    Inscrit
    août 2013
    Messages
    15
    Ok, je vais le faire. Mais je suis sûr qu\'il doit exister des trucs très complets déja faits.

  4. #4
    Membre MP
    Inscrit
    août 2013
    Messages
    15
    Voila mon code. Si on enlève les commentaires et le main qui sert de test on est à 40 lignes environ (note que je suis franc joueur car j\'ai pas chercher à optimiser, y a des acolades inutiles, etc.).

    public class Html2Text extends FileReader {

    /**
    * @param arg0
    * @throws java.io.FileNotFoundException
    */
    public Html2Text(File arg0) throws FileNotFoundException {
    super(arg0);
    if(!arg0.getName().toLowerCase().endsWith(\". html\&quot) {
    System.out.println(\"le fichier \"+arg0.getName()+\" ne finit pas par html\"
    System.exit(1);
    }
    }

    /**
    * @param arg0
    * @throws java.io.FileNotFoundException
    */
    public Html2Text(String arg0) throws FileNotFoundException {
    super(arg0);
    if(!arg0.toLowerCase().endsWith(\".html\&quot) {
    System.out.println(\"le fichier \"+arg0+\" ne finit pas par html\"
    System.exit(1);
    }
    }

    /* (non-Javadoc)
    * @see java.io.Reader#read()
    */
    public int read() throws IOException {
    int c=super.read();
    if(c==(int)\'<\') {
    while(super.read()!=(int)\'>\');
    c=super.read();
    }
    return c;
    }

    /* (non-Javadoc)
    * @see java.io.Reader#read(char[], int, int)
    */
    public int read(char[] tab, int off, int len) throws IOException {
    int indice=off;
    int c;
    while((indice-off)<len) {
    while((c=super.read())!=-1 && ((char) c)!=\'<\' && (indice-off)<len) {
    tab[indice++]=(char) c;
    }
    if(c==\'<\') {
    while(super.read()!=(int)\'>\');
    }
    if(c==-1) {
    return -1;
    }
    }
    return indice-off;
    }

    public static void main(String [] args) {
    Html2Text fichier=null;
    try {
    fichier=new Html2Text(\"test.html\"
    } catch (FileNotFoundException e) {
    e.printStackTrace();
    System.exit(1);
    }
    char [] tab=new char[100];
    try {
    fichier.read(tab,0,100);
    } catch (IOException e1) {
    e1.printStackTrace();
    System.exit(1);
    }
    System.out.println(tab);
    }
    }


    Par contre, j\'ai n\'ai pas complètement répondu à ma demande. Par exemple, les caractères spéciaux ne sont pas gérés, les balises <BR> (ou autres du même genre) ne génèrent pas de retour à la ligne, les commentaires sont supprimés (dont les mots clefs, l\'auteur et le sujet), etc.
    C\'est pour avoir qqc de complet que j\'avais posé ma question et c\'est loin d\'être trivial (j\'ai trouvé des trucs en C++ mais ils sont énormes et j\'ai pas envi de tout traduire). Ce que j\'ai trouvé en java, j\'arrive pas à le faire marcher.

  5. #5
    Membre MP
    Inscrit
    août 2013
    Messages
    1 823
    En fait ça fait 81 lignes chez moi sur eclipse (avec les parenthéses et les comment) :wink:

    J\'ai essayé ton code le fonctionnement est bon au debut je pensais que tu recuperait les argument sur la ligne de commande mais c\'est pas le cas, tu passe le nom du fichier en dur dans le code alors j\'ai fait de même (je suis joueur aussi comme tu l\'avais surement remarqué) ce qui me surprend par contre c\'est les test de validité sur les extensions de fichier ? si le nom ou l\'extension est fausse tu peux simplement avertir l\'inatentif au travers du catch.

    voici ce que j\'ai ecris ça produit une sortie ecran et fichier :

    Code:
    /*
     * Created on 21 avr. 2004
     *
     */
     
    package Indrill;
    
    import java.io.*;
    
    /**
     * @author zebpm
     *
     */
    
    public class ParseHtml {
        public static void main(String[] args) {
            try {
                FileReader html = new FileReader(\"c:\\\\test.html\");
                FileWriter text = new FileWriter(\"c:\\\\test.txt\");
                boolean Write = true;
                int caractere;
    
                do {
                        caractere = html.read();
                        if (caractere==60 || caractere==62){
                            Write=!Write;
                        }
                    if (Write && caractere!=62){
                        text.write(caractere);                //sortie fichier
                        System.out.print((char)caractere);    //sortie console
                    }    
                }while (caractere != -1);
                html.close();
                text.close();
            } catch (FileNotFoundException e) {
                System.out.println(\"Exception fichier non trouvé : \" + e.getMessage());
            } catch (IOException e) {
                System.out.println(\"Exception entrée/sortie : \" + e.getMessage());
            }
        }
    }
    j\'étais pas dans le coup avec mon histoire a 30 lignes la il y en a 41 !!!

    Bon treve de plaisanterie mon code a le même default que le tiens il zape les commentaires et ne produit pas forcement un CR sur une <BR>.

    Pour ce qui est des outils tout fait je pense aussi qu\'ils existent mais dans un cas comme celui ci je pense que c\'est pas un probleme majeur de le faire a la main.
    Nous en somme pas dieu merci a deployer une structure objet compliquée a Cuba pour faire de la replication de base entre Paris et Moscou avec une ligne RTC.

    Je comprend bien ta question mais je suis incapable d\'y repondre.

    Sinon pour les commentaires je te propose un secong round ?
    J\'ai dans l\'idée que si on pouvait se garder une petite fenetre de lecture plus grande que 1 caracter, on pourait déja faire une petite analyse de contenu pour decider si oui ou non on zap la balise.

    Qu\'en pense tu ? tu releve le defi ?

    Amicalement :wink:

  6. #6
    Membre MP
    Inscrit
    août 2013
    Messages
    15
    Je relève le défi mais je ne garantis rien pour aujourd\'hui. (J\'ai d\'autres choses à faire).
    @+ :

  7. #7
    Membre MP
    Inscrit
    août 2013
    Messages
    1 823
    Super ! J\'attend ton code et je te poste ma soluce perso (pas faite encore) à bientôt :wink:

  8. #8
    Membre MP
    Inscrit
    août 2013
    Messages
    15
    Voila mon code. Il faut noter que j\'ai corrigé une faute dans la première méthode read. Dans la version précédente, il faut remplacer le if par un while.
    Ca commence à être assez long mais je gère les balises, les espacements et les caractres spéciaux. A noter que j\'interprète pas nécessairement bien l\'intégralité des balises car je suis débutant en html.

    Code:
    public class Html2Text extends FileReader {
    	HashMap speciaux=new HashMap();
    	boolean dernierEstEspace=false;
    	HashMap balises=new HashMap();
    
    	/**
    	 * @param arg0
    	 * @throws java.io.FileNotFoundException
    	 */
    	public Html2Text(File arg0) throws FileNotFoundException {
    		super(arg0);
    		initSpeciaux();
    		initBalises();
    		if(!arg0.getName().toLowerCase().endsWith(\&quot;.html\&quot;)) {
    			System.out.println(\&quot;le fichier \&quot;+arg0.getName()+\&quot; ne finit pas par html\&quot;);
    			System.exit(1);
    		}
    	}
    
    	/**
    	 * @param arg0
    	 * @throws java.io.FileNotFoundException
    	 */
    	public Html2Text(String arg0) throws FileNotFoundException {
    		super(arg0);
    		initSpeciaux();
    		initBalises();
    		if(!arg0.toLowerCase().endsWith(\&quot;.html\&quot;)) {
    			System.out.println(\&quot;le fichier \&quot;+arg0+\&quot; ne finit pas par html\&quot;);
    			System.exit(1);
    		}
    	}
    
    	/**
    	 * initialise la liste des balises et leur caractère correspondant
    	 */
    	private void initBalises() {
    		balises.put(new String(\&quot;br\&quot;),new Character(\'\\n\'));
    		balises.put(new String(\&quot;/br\&quot;),new Character(\'\\r\'));
    		balises.put(new String(\&quot;p\&quot;),new Character(\'\\n\'));
    		balises.put(new String(\&quot;/p\&quot;),new Character(\'\\r\'));
    		balises.put(new String(\&quot;blockquote\&quot;),new Character(\'\\n\'));
    		balises.put(new String(\&quot;/blockquote\&quot;),new Character(\'\\r\'));
    		balises.put(new String(\&quot;pre\&quot;),new Character(\'\\n\'));
    		balises.put(new String(\&quot;/pre\&quot;),new Character(\'\\r\'));
    		balises.put(new String(\&quot;h1\&quot;),new Character(\'\\n\'));
    		balises.put(new String(\&quot;/h1\&quot;),new Character(\'\\r\'));
    		balises.put(new String(\&quot;h2\&quot;),new Character(\'\\n\'));
    		balises.put(new String(\&quot;/h2\&quot;),new Character(\'\\r\'));
    		balises.put(new String(\&quot;h3\&quot;),new Character(\'\\n\'));
    		balises.put(new String(\&quot;/h3\&quot;),new Character(\'\\r\'));
    		balises.put(new String(\&quot;h4\&quot;),new Character(\'\\n\'));
    		balises.put(new String(\&quot;/h4\&quot;),new Character(\'\\r\'));
    		balises.put(new String(\&quot;h5\&quot;),new Character(\'\\n\'));
    		balises.put(new String(\&quot;/h5\&quot;),new Character(\'\\r\'));
    		balises.put(new String(\&quot;h6\&quot;),new Character(\'\\n\'));
    		balises.put(new String(\&quot;/h6\&quot;),new Character(\'\\r\'));
    		balises.put(new String(\&quot;hr\&quot;),new Character(\'\\n\'));
    		balises.put(new String(\&quot;/hr\&quot;),new Character(\'\\r\'));
    		balises.put(new String(\&quot;img\&quot;),new Character(\'\\n\'));
    		balises.put(new String(\&quot;/img\&quot;),new Character(\'\\r\'));
    		balises.put(new String(\&quot;area\&quot;),new Character(\'\\r\'));
    		balises.put(new String(\&quot;/area\&quot;),new Character(\'\\n\'));
    		balises.put(new String(\&quot;map\&quot;),new Character(\'\\r\'));
    		balises.put(new String(\&quot;/map\&quot;),new Character(\'\\n\'));
    		balises.put(new String(\&quot;table\&quot;),new Character(\'\\n\'));
    		balises.put(new String(\&quot;/table\&quot;),new Character(\'\\r\'));
    		balises.put(new String(\&quot;tr\&quot;),new Character(\'\\n\'));
    		balises.put(new String(\&quot;/tr\&quot;),new Character(\'\\r\'));
    		balises.put(new String(\&quot;td\&quot;),new Character(\'\\t\'));
    		balises.put(new String(\&quot;th\&quot;),new Character(\'\\n\'));
    		balises.put(new String(\&quot;/th\&quot;),new Character(\'\\r\'));
    		balises.put(new String(\&quot;ul\&quot;),new Character(\'\\n\'));
    		balises.put(new String(\&quot;/ul\&quot;),new Character(\'\\r\'));
    		balises.put(new String(\&quot;li\&quot;),new Character(\'\\t\'));
    		balises.put(new String(\&quot;/li\&quot;),new Character(\'\\n\'));
    		balises.put(new String(\&quot;form\&quot;),new Character(\' \'));
    		balises.put(new String(\&quot;input\&quot;),new Character(\' \'));
    		balises.put(new String(\&quot;select\&quot;),new Character(\' \'));
    		balises.put(new String(\&quot;option\&quot;),new Character(\' \'));
    		balises.put(new String(\&quot;textarea\&quot;),new Character(\' \'));
    		balises.put(new String(\&quot;embed\&quot;),new Character(\'\\n\'));
    		balises.put(new String(\&quot;/embed\&quot;),new Character(\'\\r\'));
    		balises.put(new String(\&quot;aplet\&quot;),new Character(\'\\n\'));
    		balises.put(new String(\&quot;/applet\&quot;),new Character(\'\\r\'));
    	}
    
    	/**
    	 * initialise la liste des caractères spéciaux et leur caractère correspondant
    	 */
    	private void initSpeciaux() {
    		speciaux.put(new String(\&quot;quot\&quot;),new Character(\'\&quot;\'));
    		speciaux.put(new String(\&quot;amp\&quot;),new Character(\'&amp;\'));
    		speciaux.put(new String(\&quot;lt\&quot;),new Character(\'&lt;\'));
    		speciaux.put(new String(\&quot;gt\&quot;),new Character(\'&gt;\'));
    		speciaux.put(new String(\&quot;nbsp\&quot;),new Character(\' \'));
    		speciaux.put(new String(\&quot;brvbar\&quot;),new Character(\'|\'));
    		speciaux.put(new String(\&quot;sect\&quot;),new Character(\'§\'));
    		speciaux.put(new String(\&quot;curren\&quot;),new Character(\'¤\'));
    		speciaux.put(new String(\&quot;uml\&quot;),new Character(\'¨\'));
    		speciaux.put(new String(\&quot;deg\&quot;),new Character(\'°\'));
    		speciaux.put(new String(\&quot;ccedil\&quot;),new Character(\'ç\'));
    		speciaux.put(new String(\&quot;agrace\&quot;),new Character(\'à\'));
    		speciaux.put(new String(\&quot;acirc\&quot;),new Character(\'â\'));
    		speciaux.put(new String(\&quot;apilde\&quot;),new Character(\'ã\'));
    		speciaux.put(new String(\&quot;auml\&quot;),new Character(\'ä\'));
    		speciaux.put(new String(\&quot;eacute\&quot;),new Character(\'é\'));
    		speciaux.put(new String(\&quot;egrave\&quot;),new Character(\'è\'));
    		speciaux.put(new String(\&quot;ecirc\&quot;),new Character(\'ê\'));
    		speciaux.put(new String(\&quot;euml\&quot;),new Character(\'ë\'));
    		speciaux.put(new String(\&quot;icirc\&quot;),new Character(\'î\'));
    		speciaux.put(new String(\&quot;iuml\&quot;),new Character(\'ï\'));
    		speciaux.put(new String(\&quot;ocirc\&quot;),new Character(\'ô\'));
    		speciaux.put(new String(\&quot;ugrave\&quot;),new Character(\'ù\'));
    		speciaux.put(new String(\&quot;ucirc\&quot;),new Character(\'û\'));
    		speciaux.put(new String(\&quot;uuml\&quot;),new Character(\'ü\'));
    	}
    
    	/* (non-Javadoc)
    	 * @see java.io.Reader#read()
    	 */
    	public int read() throws IOException {
    //		si nécessaire on prend le caractere ignore au dernier appel
    //		sinon on prend le prochain
    		int c=super.read();
    
    //		on remplace les balises soit par \' \' soit par \'\\n\' soit par \'\\t\' soit par rien
    		while(c==(int)\'&lt;\') {
    //			on lit le nom de la balise
    //			il ne peut pas y avoir de -1 car une balise se ferme tjrs
    			char [] balise=new char[20];
    			int indice=0;
    //			cas des balises spéciales (commencant par !)
    			if((balise[indice++]=(char)super.read())==\'!\') {
    				while(((char)super.read())!=\'&gt;\');
    				return read();
    			}
    			while((balise[indice]=(char)super.read())!=\'&gt;\' &amp;&amp; balise[indice++]!=\' \');
    //			on ignore le reste
    			if(balise[indice-1]==\' \') {
    				while(((char)super.read())!=\'&gt;\');			
    			}
    //			on remplace la balise par le caractère correspondant
    			Character carac=(Character) balises.get(new String(balise,0,indice).toLowerCase());
    			if(carac==null) {
    				return read();
    			}
    			return carac.charValue();
    		}
    		
    //		on transforme les caractères spéciaux
    		if(c==\'&amp;\') {
    			char [] carac=new char[10];
    			int tmp,indice=0;
    			while((tmp=super.read())!=-1 &amp;&amp; tmp!=\';\') {
    				carac[indice++]=(char) tmp;
    			}
    			if(tmp==-1) {
    				return -1;
    			}
    //			si carac commence par un # alors on a le code ISO, sinon on a une chaine equivalente
    			return carac[0]!=\'#\' ?	((Character)speciaux.get(new String(carac,0,indice))).charValue():
    									(char) new Integer(new String(carac,1,indice-1)).intValue();
    		}
    		
    //		on transforme les suites de séparateurs en un unique espace
    //		sauf quand signalé comme caractère spécial ou dû à une balise
    		if(dernierEstEspace==true &amp;&amp; Character.isWhitespace((char) c)) {
    			dernierEstEspace=true;
    			return read();
    		}
    		else if(Character.isWhitespace((char) c)) {
    			dernierEstEspace=true;
    			c=\' \';
    		}
    		else {
    			dernierEstEspace=false;			
    		}
    
    		return c;
    	}
    
    	/* (non-Javadoc)
    	 * @see java.io.Reader#read(char[], int, int)
    	 */
    	public int read(char[] tab, int off, int len) throws IOException {
    		int indice=off;
    		int c;
    		while((indice-off)&lt;len) {
    			c=read();
    			System.out.print((char)c);
    			if(c!=-1) {
    				tab[indice++]=(char) c;
    			}
    			else {
    				return -1;
    			}
    		}
    		return indice-off;
    	}
    	
    	public static void main(String [] args) {
    		Html2Text fichier=null;
    		try {
    			fichier=new Html2Text(\&quot;test.html\&quot;);
    		} catch (FileNotFoundException e) {
    			e.printStackTrace();
    			System.exit(1);
    		}
    		
    		int c;
    		try {
    			while((c=fichier.read())!=-1) {
    				System.out.print((char)c);
    			}
    		} catch (IOException e1) {
    			e1.printStackTrace();
    			System.exit(1);
    		}
    	}
    }

  9. #9
    Membre MP
    Inscrit
    août 2013
    Messages
    1 823
    Salut Indril

    désolé donne moi 1 ou 2 jours j\'ai un travail monstre sur les bras et je dois livrer la Beta chez le client mardi.

    J\'espère que tu ne m\'en voudra pas et je te donne ma version d\'ici la.

    Ton traitement des balises semble trés complet et je ne sais pas si j\'en ferai autant en tous cas je promet une solluce pour les BR et les commentaires.

    @+ :wink:

  10. #10
    Membre MP
    Inscrit
    août 2013
    Messages
    1 823
    Bonjour Indrill Chose promise chose du.

    Voila j\'ai moi aussi remanié mon code (et corrigé un defaut).
    La mise en oeuvre du traitement des balises a permis de simplifier la conditionnelle d\'écriture.
    J\'ai aussi redoné a tout ce code un aspet plus Objet dans la mesure ou j\'y ai rajouté un constructeur et des propriété.
    Ce code est donc instanciable de nimporte ou et permet la génération d\'un fichier texte comme convenue.
    Il est de plus possible de lui faire effectuer une sortie ecran en mode \'Verbose\' grace a un accesseur sur le boolean du même nom.
    J\'ai laissé dedans la Main qui m\'a permis de faire des test, elle n\'est pas utile dans le cas d\'un objet Instancié d\'une autre classe.
    Comme je te le disais, je traite les \'&lt;br&gt;\' et les lignes de commentaire mais pas les autres balises. Il n\'est pas compliqué de rajouter un traitement particulier pour une balise particuliaire et je laisse ce devellopement a ceux qui en auront le courage.
    Il faux noter que le code fonctionne trés bien aussi sur un fichier XML.
    J\'arrive maintenant a 88 lignes tout compris ce la reste resonable.

    Code:
    package Indrill;
    /*
     * Created on 25 avr. 2004
     */
    
    import java.io.*;
    
    /**
     * @author zebpm
     * contact zebpm@hotmail.com
     */
    
    public class ParseHtml {
        
        private String HtmlFile = null;
        private String TextFile = null;
        private boolean Verbose = false;
        
        /**
         * Constructeur 
         * @param FileToParse Fichier Html Source 
         * @param DestFile Fichier de destination 
         */
        public     ParseHtml(String FileToParse,String DestFile){
            this.HtmlFile = FileToParse;
            this.TextFile = DestFile;
        }
    
        /**
         * Fonction Parse : declanche le parcour du fichier Html et genere un fichier texte en sortie
         */
        public void Parse(){
            try {
                FileReader html = new FileReader(this.HtmlFile);
                FileWriter text = new FileWriter(this.TextFile);
                int caractere;
                
                do {
                    caractere = html.read();            
                    if (caractere==60){
                        // traitement des balises
                        String Balise = \&quot;&lt;\&quot;;
                        int i = 0;
                        do{
                            caractere = html.read();
                            Balise = Balise + (char)caractere;
                            i++;
                        }while (caractere != 62);
                        // la String \'Balise\' contient la balise rencontrée au complet y compris les caracteres \'&lt;\' et \'&gt;\'
                        if (Balise.equals(\&quot;&lt;br&gt;\&quot;)){                            // cas de la BR
                            text.write(\&quot;\\n\&quot;);                                //sortie fichier
                            if (this.Verbose){System.out.print(\&quot;\\n\&quot;);}        //sortie console
                        }
                        if (Balise.charAt(1)==33){                            // cas du commentaire
                            text.write(Balise);                                //sortie fichier
                            if (this.Verbose){System.out.print(Balise);}    //sortie console
                        }
                        /* possibilité de traiter d\'autres balises ici dans une nouvelle condition if */
                    }
                    if (caractere!=62){
                        // traitement des zones hors des balises Html
                        text.write(caractere);                    //sortie fichier
                        if (this.Verbose){System.out.print((char)caractere);}        //sortie console
                    }    
                }while (caractere != -1);
                html.close();
                text.close();
            } catch (FileNotFoundException e) {
                System.out.println(\&quot;Exception fichier non trouvé : \&quot; + e.getMessage());
            } catch (IOException e) {
                System.out.println(\&quot;Exception entrée/sortie : \&quot; + e.getMessage());
            }
        }
        
        /**
         * Valide / invalide la sortie ecran
         * @param boolean Verbose
         */
        public void setVerbose(boolean b) {
            this.Verbose = b;
        }
        
        public static void main(String[] args) {
            ParseHtml X = new ParseHtml(\&quot;c:\\\\test.html\&quot;,\&quot;c:\\\\test.txt\&quot;);
            X.setVerbose(true);
            X.Parse();
        }
    }

    je ne pense pas que ce code soit un modele de vertue universel mais il me semble plutôt correct au vue du defi que nous nous étions donné tous le deux.

    Désire tu aller plus loing ?

    Si oui donne moi tes impressions et tes idées.

    Amicalement :wink:

Page 1 sur 2 12 DernièreDernière

Informations du sujet

Utilisateur(s) parcourant ce sujet

il y a actuellement 1 utilisateur(s) parcourant ce sujet. (0 membre(s) et 1 visiteur(s))

Règles des messages

  • Vous ne pouvez pas créer de sujets
  • Vous ne pouvez pas répondre aux sujets
  • Vous ne pouvez pas importer de fichiers joints
  • Vous ne pouvez pas éditer vos messages
  •  
  • Les BB codes sont Activés
  • Les Smileys sont Activés
  • Le BB code [IMG] est Activé
  • Le code [VIDEO] est Activé
  • Le code HTML est Désactivé
Please disable Adblock!