IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API standards et tierces Java Discussion :

RegEx pour extraire les liens d'une page html


Sujet :

API standards et tierces Java

  1. #1
    Membre éclairé Avatar de herch
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    655
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2006
    Messages : 655
    Points : 773
    Points
    773
    Par défaut RegEx pour extraire les liens d'une page html
    salut à tous,

    ce que je voudrais, c'est extraire tous les liens d'une page html (balise <a href ..>).... mais on obtient pas toujours ce qu'on veut

    j'ai d'abord essayé ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Pattern.compile(".*?<a\\s+href\\s*=\\s*[\"']?([^\"'>]*?)[\"']?>.*?");
    cela marche bien, mais cette expression rate par exp les liens qui sont ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <a href="http://site.com" title="titre" target="_blank">
    donc j'ai essayé ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Pattern.compile(".*?<a\\s+href\\s*=\\s*[\"']?([^\"'>]*?)[\"']?[^>]*>.*?");
    sans succès
    et cela aussi sans succès
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Pattern.compile(".*?<a\\s+href\\s*=\\s*[\"']?([^\"'>]*?)[\"']?.*?>.*?");
    si quelqu'un a une idée

  2. #2
    Membre éclairé Avatar de zorm
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    584
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 584
    Points : 672
    Points
    672
    Par défaut
    Bonjour,

    Le problème est que tu ne prévois pas dans ton expression qu'il y ait d'autres attributs. Un problème est qu'il n'y a pas d'ordre dans l'écriture des attributs, donc le href n'est pas forcement après le <a ...
    Un solution serait de dire d'accepter tout caractère avant et après le href du moment que c'est bien encadré par le <a

    Ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .*?<a\\s+.*href\\s*=\\s*[\"']?([^\"'>]*)[\"']?.*>.*?
    Maintenant, penses tu que ça soit la meilleure solution? tu pourrais aussi utiliser un parseur HTML pour ça...

  3. #3
    Membre éclairé Avatar de herch
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    655
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2006
    Messages : 655
    Points : 773
    Points
    773
    Par défaut
    salut, et merci pour la réponse,

    c'est vrai que je n'avais pensé à cette éventualité, vu que presque tout le monde mets href en premier, mais c'est vrai qu'on ne sait jamais

    mais le problème vient principalement des attributs après le href
    quand je fais ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "<a\\s+href\\s*=\\s*[\"']?([^\"'>]*?)[\"']?.*?>"
    cela devrait correspondre à un truc du genre
    <a href="http://monsite.com" unAttribut="valeur">
    et le dernier .* devrait correspondre à ( unAttribut="valeur"), et l'appel de group(1) devrait le retourner (http://monsite.com) mais c'est pas le cas

  4. #4
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Si tu veux uniquement récupéré les URLs, autant recherché uniquement les href :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Pattern.compile("href=([\"'])(.*?)\\1", Pattern.CASE_INSENSITIVE)
    a++

  5. #5
    Membre émérite
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Points : 2 582
    Points
    2 582
    Par défaut
    Retrouver les href avec des regexp dans tous les cas imaginables qui peuvent se produire sur le web, c'est mission impossible.

    Donc, soit tu te donnes un sous ensemble et tu nous dis lequel (par exemple tu admets ne pas tenir compte des commentaires html, etc), soit tu devras utiliser un parser html.

  6. #6
    Membre éclairé Avatar de herch
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    655
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2006
    Messages : 655
    Points : 773
    Points
    773
    Par défaut
    salut,

    c'est vrai qu'en ne cherchant que les href, ça simplifie énormément l'expression.

    et c'est vrai aussi, je viens de m'en rendre compte, que ce serait du vrai masochisme que d'essayer de faire ce que je veux avec seulement des regex, donc, je crois que finalement je me tournerais vers un parser html.

    auriez vous un parser spécifique à me conseiller??

    et merci pour vos réponses

  7. #7
    Membre émérite
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Points : 2 582
    Points
    2 582
    Par défaut
    Peut être NekoHTML.

  8. #8
    Membre éclairé Avatar de herch
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    655
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2006
    Messages : 655
    Points : 773
    Points
    773
    Par défaut
    salut,

    je viens de faire un tour dans leur site, mais j'avoue que je n'ai pas très bien compris leurs exemples

    par contre, je viens de tester htmlparser, et elle me convient parfaitement

    voici un petit exemple qui extrait les liens d'une page passé en argument pour le main

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    import org.htmlparser.NodeFilter;
    import org.htmlparser.Parser;
    import org.htmlparser.filters.NodeClassFilter;
    import org.htmlparser.tags.LinkTag;
    import org.htmlparser.util.NodeList;
    import org.htmlparser.util.ParserException;
     
    public class ExtractLinks {
     
    	public static void main(String[] args) {
    		NodeList list;
    		Parser parser;
    		NodeFilter filter = new NodeClassFilter(LinkTag.class);
    		try {
    			parser = new Parser(args[0]);
    			//j'avais des problèmes à lire des pages en arabe, c'est pour cela que j'ai ajouté cette ligne
    			parser.setEncoding("utf8");     
    			list = parser.parse(filter);
    			for (int i = 0; i < list.size(); i++) {
    				LinkTag linkTag = (LinkTag)list.elementAt(i);
    				System.out.println(linkTag.extractLink());
    			}
    		} catch (ParserException e) {
    			e.printStackTrace();
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur, Parser : récupérer les liens d'une page html
    Par floflo_2006 dans le forum Général Java
    Réponses: 5
    Dernier message: 13/12/2006, 01h26
  2. Récupérer tous les liens d'une page html
    Par lapras123 dans le forum C
    Réponses: 28
    Dernier message: 08/08/2006, 11h30
  3. Réponses: 7
    Dernier message: 14/09/2005, 10h50
  4. réinitialiser les liens d'une page html
    Par sisco dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 05/11/2004, 16h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo