Problème parse liens page web dans fichier txt
dd
-
dd -
dd -
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...
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:
- Problème parse liens page web dans fichier txt
- Fichier bin - Guide
- Fichier epub - Guide
- Web office - Guide
- Fichier rar - Guide
- Supprimer une page dans word - Guide
4 réponses
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
Bonjour,
Dans ton code tu fais des
Tu as 27394 pages en tout, mais seulement 27387 différentes, les 7 doublons ne sont pas pris dans la Map.
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.
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é"); } }
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.
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.
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)
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).
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).