Problème parse liens page web dans fichier txt

Fermé
dd - Modifié le 4 nov. 2017 à 14:02
 dd - 5 nov. 2017 à 12:35
Bonjour,

J'ai une autre fonction qui se charge de scanner un fichier composé de liens de pages et de liens vers la page qui mène à cette page (origine).

Normalement je devrais avoir 27394 pages dans la HashMap après scan, mais j'en ai que 27387.

J'ai essayé de faire des prints un peu partout pour voir ce qui se passe, mais ça semble pourtant bien fonctionner, mais le scan doit manquer des pages. J'ai passé 3 après-midi sur cette fonction (readWebPages(), de la classe SearchEngine) sans arriver à trouver le problème et j'aimerai bien le trouver.

Je mets les fichiers du projet dans un lien (url supprimée par la modération)

Le code (pour éviter les robots trop curieux) 88cPvRc4

Les fichiers txt scannés sont dans le répertoire data du projet...
A voir également:

4 réponses

jordane45 Messages postés 38346 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 décembre 2024 4 717
4 nov. 2017 à 14:02
Bonjour

Merci de poster ton code directement sur le forum.
0
	public void readWebPages() {


	    File f;
	    FileReader fr;
	    BufferedReader br;
	    	    	    
	    String pageAdress;

	    String pageAdress2;

	    String fromAdress;
	    
	    WebPage webPage;
	    

		try
		{
		    f = new File (this.webPagesFile);
		    fr = new FileReader (f);
		    br = new BufferedReader (fr);
		 
		    try
		    {
		    
		         
		        String line = br.readLine();
		 
		        line = br.readLine();
				 
		        while (line != null)
		        	
		        {
		    	
		        	
		        	System.out.println("ligne brute " + line);
		        line = line.replaceAll("http://", "");
		        
		        line = line.replaceAll("https://", "");
		        
		        line = line.replaceAll("\\./", "");
		        	 
		        String[] infos=line.split("\\t");  
		        
		        pageAdress = new String(infos[7]);
		        
		        pageAdress2 = new String(infos[8]);
		        
		    	fromAdress = new String(infos[9]);

		    	fromAdress = fromAdress.substring(fromAdress.indexOf("(")+6, fromAdress.indexOf(")"));

		    	System.out.println("PageAdress1 " + pageAdress + " PageAdress2 " + pageAdress2 + "From adress " + fromAdress); 
		    	if(fromAdress.length() > 1) { // on a une origine
		    		
		    		//if(!this.webPages.containsKey(pageAdress))
		    		
		    			this.webPages.putIfAbsent(pageAdress, new WebPage(pageAdress));
				        if(pageAdress2.length() > 2) {
				        	this.webPages.putIfAbsent(pageAdress2, new WebPage(pageAdress2));
				 //       	System.out.println("Ajoute page " + pageAdress2);
				        }
		    			
		    		
		    	//	if(!this.webPages.containsKey(fromAdress))
		    			this.webPages.putIfAbsent(fromAdress, new WebPage(fromAdress));
		    		
			        webPage = this.webPages.get(fromAdress);
			        
			        if(!webPage.linkedPages.contains(new WebPage(pageAdress))) {
			        	webPage.linkedPages.add(new WebPage(pageAdress));
			        
			        this.webPages.replace(fromAdress, webPage);
			        
			        
			        }

			        if(pageAdress2.length() > 2) { 

			        if(!webPage.linkedPages.contains(new WebPage(pageAdress2))) {
			        	webPage.linkedPages.add(new WebPage(pageAdress2));
			        
			        this.webPages.replace(fromAdress, webPage);
			        
			        }			        
			        }
			        
			        webPage = this.webPages.get(pageAdress);

			        if(!webPage.linkingPages.contains(new WebPage(fromAdress))) {
			        webPage.linkingPages.add(new WebPage(fromAdress));
			        
			        this.webPages.replace(pageAdress, webPage);
			        }
			        
			        if(pageAdress2.length() > 2) { 
			        	
			        
			        webPage = this.webPages.get(pageAdress2);

			        if(!webPage.linkingPages.contains(new WebPage(fromAdress))) {
			        webPage.linkingPages.add(new WebPage(fromAdress));
			        
			        this.webPages.replace(pageAdress2, webPage);
			        }
			        
			        }
		    	} else {
		    		
		    		if(!this.webPages.containsKey(pageAdress))
		    			this.webPages.put(pageAdress, new WebPage(pageAdress));
		    		
		    	}

		    	
		    	
		    	
//		    			 this.webPages.put(pageAdress, webPage);
		        
	//	        webPage = new WebPage(pageAdress);  

		    //    System.out.println("readWebPages " + pageAdress);

		/*        webPage.setLinkingPages(this.getlinkingPages(pageAdress));

		     //   System.out.println("Linking done " + pageAdress);

		        webPage.setLinkedPages(this.getlinkedPages(pageAdress));

		      //  System.out.println("Linked done " + pageAdress);

		       
		        System.out.println("putDone " + pageAdress);
*/
		    		 line = br.readLine();
		        }
		        
		        System.out.println("Fini read");
		        
		  
		   
		       
		        br.close();
		        fr.close();
		    }
		    catch (IOException exception)
		    {
		        System.out.println ("Erreur lors de la lecture : " + exception.getMessage());
		    }
		}
		catch (FileNotFoundException exception)
		{
		    System.out.println ("Le fichier n'a pas été trouvé");
		}
		
	
		if(this.webPages.containsKey("cas.univ-avignon.fr_443/login2a7b.html")) System.out.println("Contient page");

		System.out.println("Debut 34");
		
		 for (Map.Entry entry : this.webPages.entrySet()) {
			    
		    	/*  System.out.println("clé 2246: "+entry.getKey() 
	              + " | valeur: " + entry.getValue());*/

			//    System.out.println(entry.getKey());
		 }
		
	}



Pour le fichier txt contenant les pagesWeb, il faut le prendre dans le lien de mon premier message, c'est trop gros
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
4 nov. 2017 à 15:23
Bonjour,

Dans ton code tu fais des
this.webPages.putIfAbsent
(this inutile soit dit en passant) mais que se passe-t-il s'il sont déjà prénsent ? Et bien il ne fait rien, ce qui explique pourquoi tu n'as pas tout...

Tu as 27394 pages en tout, mais seulement 27387 différentes, les 7 doublons ne sont pas pris dans la Map.
0
Merci de la réponse, par contre maintenant j'ai un problème dans readKeyWords, il devrait trouver 832 pages pour le mot-clé informatique, mais il n'en trouve que 812. Le fichier index_small.txt est dans le lien de mon premier message

	public void readKeyWords() {


	    File f;
	    FileReader fr;
	    BufferedReader br;
	    	    	    
	    String pageAdress;
	    
	    String currentKeyWord = "";
	    
	    DataKeyWord dataKeyWord1;
	    
		try
		{
		    f = new File (this.keyWordsFile);
		    fr = new FileReader (f);
		    br = new BufferedReader (fr);
		 
		    try
		    {
		    
		         
		        String line = br.readLine();
		 
		        
		        while (line != null)
		        	
		        {
		        	

		    	
		        	

		        	System.out.println("ligne brute : " + line);

		        	
		        	if(line.equals("	")) break;
		        	
		        String[] infos=line.split("\\t");  
		        
		        if(infos.length == 1) { // ligne de mot cle

		        //	System.out.println(" ligne mot cle");

		        	currentKeyWord = infos[0];
		        	
		        	//System.out.println("Ajoute mot cle");
		        	this.dataKeyWords.put(currentKeyWord, new DataKeyWord(currentKeyWord));
		        	
		        	keyWordsList.contains(currentKeyWord);
		        	
		        	this.myDataStructure.addKeyWord(currentKeyWord);
		        	
		        	
		        	 	
		        } else {
		        	
		     //   	System.out.println("pas ligne mot cle");

		        	System.out.println("infos1 brut " + infos[1]);
		        	
		        	infos[1] = infos[1].replaceAll("(=([1-9]|\\d{2,6})\\b)|(\\b([1-9]|\\d{2,6}) )|(\\(\\d+\\))","");
		        	
		        	/*infos[1] = infos[1].replaceAll("=[0-9]","");

		        	infos[1] = infos[1].replaceAll("([0-9])","");*/

		        	infos[1] = infos[1].replaceAll(" ","");
		        	
		        	/*infos[1] = infos[1].replaceAll("=","");

		        	infos[1] = infos[1].replaceAll("\\(","");

		        	infos[1] = infos[1].replaceAll("\\)","");
		        	infos[1] = infos[1].replaceAll("^[0-9]","");*/
		        	

		        	System.out.println("infos1" + infos[1] );
		        	
		        	System.out.println("ligne brute : " + line);
		        	
		        	
		        	if(infos[1].length() > 2 && (this.webPages.containsKey(infos[1]))) {
		        		
		        		this.keyWords.put(infos[1],currentKeyWord);
		        		
		        		dataKeyWord1 = this.dataKeyWords.get(currentKeyWord);
		        		
		        		dataKeyWord1.webPagesLink.add(infos[1]);
		        		
		        		this.dataKeyWords.replace(currentKeyWord, this.dataKeyWords.get(currentKeyWord), dataKeyWord1);
		        		
		        		
		        		
		        	if(currentKeyWord.equals("informatique")) System.out.println("Ajoute " + currentKeyWord + "," + infos[1] + ", taille");
		        	
		        	this.myDataStructure.addWebPage(currentKeyWord, infos[1]);
		        	
		        	}
		        	/*
		        	for (Map.Entry entry : webPages.entrySet()) {
		        		
		        	
		        		if(entry.getKey().equals(infos[1])) {
		        			
				        	for (Map.Entry dataKeyWord : this.dataKeyWords.entrySet()) {
		        				 
		        				 if(dataKeyWord.getKey().equals(currentKeyWord)) {
		        					 dataKeyWord1 = (DataKeyWord) dataKeyWord.getValue();
		        					 dataKeyWord1.webPagesLink.add(infos[1]);
		        					 this.dataKeyWords.replace(currentKeyWord, dataKeyWord1);
		        				 }
		        				 
		        			 }
		        			
		        			
		        		}
		        	
		                /*System.out.println("clé: "+entry.getKey() 
		                                   + " | valeur: " + entry.getValue()); 
		                
		        	} */
		        	
		             }	
		        	
		        	
		        line = br.readLine();
		        
		        }
		  
		   
		        System.out.println("Nb mots clés " + this.myDataStructure.dataKeyWords.size());

				 System.out.println("nbPages pour informatique " + this.myDataStructure.get("informatique").webPagesLink.size());

		        
		        br.close();
		        fr.close();
		    }
		    catch (IOException exception)
		    {
		        System.out.println ("Erreur lors de la lecture : " + exception.getMessage());
		    }
		}
		catch (FileNotFoundException exception)
		{
		    System.out.println ("Le fichier n'a pas été trouvé");
		}
		
	}
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
5 nov. 2017 à 00:08
C'est la même chose, une Map n'accepte pas les doublons, donc si tu en as le nombre de résultats retenus à la fin sera plus petit que le nombre d'éléments soumis.
La seule différence c'est que put va remplacer la première valeur du doublon par la deuxième tandis que putIfAbsent va conserver la première valeur et ignorer la deuxième.
0
dd > KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024
5 nov. 2017 à 00:25
J'ai besoin que le code trouve 832 pages, si les à cause des doublons qui sont infine supprimés, il faut que je les conserves mais je sais pas comment
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019 > dd
5 nov. 2017 à 00:40
Dans tous les cas une Map n'accepte pas les doublons, il y a plusieurs alternatives possibles, tout dépend ce que tu veux en faire derrière :
  • List<Entry<K,V>> → [(a=1), (b=2), (c=3), (c=4)]
  • Map<K, List<V>> → {a=[1], b=[2], c=[3, 4]}
0
dd > KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024
Modifié le 5 nov. 2017 à 00:54
Je ne comprends pas pourquoi il y aurait un problème de doublons puisque j'ajoute les pages dans une liste contenu dans l'objet DataKeyWord de chaque mot clé de MyDataStructure, quand je fais print et que ça donne 812 c'est la taille de la liste des pages du mot clé ça utilise pas la map donc ça peut pas être un problème de doublons (je pense)
0
J'ai trouvé le problème, mais je ne sais pas comment le résoudre.

A chaque fois qu'il ne trouve pas une page qu'il aurait du trouver (qu'il ne trouve pas dans la liste webPages alors que celle-ci sont dans le fichier source de webPages), c'est une page avec des caractères spéciaux, (accents, cédilles).
0