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

Java Discussion :

Parsers HTML: lequel utiliser ?


Sujet :

Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 64
    Points : 44
    Points
    44
    Par défaut Parsers HTML: lequel utiliser ?
    Bonjour tout le monde!
    Je souhaite développer en Java une appli qui récupère des infos d'allocine.
    Pour ce faire, je parse la page de recherche mais mon code est assez ..."lourd et basique"....

    Que me conseilleriez vous comme API Java qui parse du HTML ?

    En effet, je pense que ca sera plus simple
    Mais je souhaite que cette API me permette aussi de récupérer des infos non contenues dans un code, mais entre deux balises...


    Merci d'avance !

  2. #2
    Membre chevronné

    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Novembre 2006
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 252
    Points : 1 954
    Points
    1 954
    Par défaut
    Neko est pas mal. Permet de retourner un doc html bien formé.

  3. #3
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 133
    Points : 101
    Points
    101
    Par défaut
    je te conseille HTMLParser

    regarde dans la doc, il y a plein d'exemples.

    bon courage.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 64
    Points : 44
    Points
    44
    Par défaut
    J'ai tenté d'utiliser HTMLParser, je le trouve très bien.Seulement, je souhaite dans une partie de mon application extraire du texte entre deux balises



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <b>Films <h4>(33 réponses)</h4></b>
    Si l'on regarde cet exemple,je souhaite récupérer le texte "33 réponses".
    J'ai déja réussi à configurer pour récupérer uniquement certaines URL mais est ce possible de configurer un "intervalle de parsing" ?



    Pourrais tu m'aider?



    Merci beaucoup d'avance

  5. #5
    Membre confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Août 2007
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Août 2007
    Messages : 509
    Points : 622
    Points
    622
    Par défaut
    Pourquoi tu n'utilises pas SAX?

  6. #6
    Membre chevronné

    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Novembre 2006
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 252
    Points : 1 954
    Points
    1 954
    Par défaut
    Par ce qu'il faut que l'html soit bien formé (balises concordantes entre autres), ce qui est loin d'être toujours le cas. C'est pourquoi je proposais Neko qui lui restitue un XML parfaitement bien formé.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 64
    Points : 44
    Points
    44
    Par défaut
    J'utilise actuelle Neko.

    En fait voici une page type que je veux parser.
    http://www.allocine.fr/recherche/?rub=1&motcle=Jones



    Voici mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ArrayList<Hashtable<String, String>> list = new ArrayList<Hashtable<String, String>>();
    		URL url = makeSearchURL(pattern);
     
    		DOMParser parser = createParser();
    		HTMLDocument doc = createDocument(url, parser);
    		if (doc == null)
    			return null;
    		HTMLElement element;
    		Hashtable<String, String> netMovie;
     
     
    		element = (HTMLElement).doc.getElementsByTagName("h3").item(0);
    Je souhaite récupérer le contenu présent dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <h3><b>Films <h4>(33 réponses)</h4></b></h3>
    Récupérer 33 en guise de réponse.

    Je ne vois pas comment faire...

    Sinon je souhaite apres récupérer par exemple sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <a href="/film/fichefilm_gen_cfilm=45890.html" class="link1">Indiana <b>Jones</b> et le Royaume du Crâne de Cristal</a></h4><h5>
    L'URL et le titre du film...

    Seulement j'ignore comment faire :'[

    Quelqu'un pourrait m'aider voire me renvoyer vers des exemples?

    Merc d'avance !

  8. #8
    Membre chevronné

    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Novembre 2006
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 252
    Points : 1 954
    Points
    1 954
    Par défaut
    T'as essayé getTextContent() ? Ca devrait te retourner le texte contenu entre 2 balises.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    element.getTextContent();

  9. #9
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 33
    Points : 36
    Points
    36
    Par défaut
    Je ne suis pas grand connaisseur des api de parsing HTML en java, mais je me pose tout de même une question : pourquoi ne pas opter pour une solution personnaliser en implémentant son propre parseur à base d'expression régulière ? ça aurait au moins l'avantage de répondre à tout ses besoins d'extraction de données, non ? C'est peut être assez indigeste à écrire, mais largement plus puissant ....

  10. #10
    Membre chevronné

    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Novembre 2006
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 252
    Points : 1 954
    Points
    1 954
    Par défaut
    Citation Envoyé par fouckybzh Voir le message
    Je ne suis pas grand connaisseur des api de parsing HTML en java, mais je me pose tout de même une question : pourquoi ne pas opter pour une solution personnaliser en implémentant son propre parseur à base d'expression régulière ?
    Par ce que réinventer la roue ca coute en temps d'analyse, de mise au point et de maintenance pour un résultat qui ne sera pas meilleur que ce qu'il existe sur étagère.

    Citation Envoyé par fouckybzh Voir le message
    ça aurait au moins l'avantage de répondre à tout ses besoins d'extraction de données, non ? C'est peut être assez indigeste à écrire, mais largement plus puissant ....
    Plus puissant qu'une requête XQurery ?

  11. #11
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 33
    Points : 36
    Points
    36
    Par défaut
    Par ce que réinventer la roue ca coute en temps d'analyse
    Là, tu prêches un convaincu. Mais là où j'émets un doute, c'est que les outils de parsing XHML/XML, comme XQuery, ..., puissent être la réponse au besoin de Richard_Rahl .... (tiens en voilà un qui aime la fantaisy ... pardon, je m'écarte du sujet)

    Bref, je m'explique. A ma connaissance, les outils de requêtes type xpath, permettent de faire une requete sur un document xhtml/xml, en utilisant comme critère, le contenu d'une balise, la présence d'un attribut, la valeur d'un attribut, etc .... (j'éviterai d'être exhaustif, faute de connaissance) et permet de retourner en résultat une liste de balise et mieux encore le contenu d'un ou plusieurs balise, non ?

    Oui, ces outils vont te permettre de récupérer le contenu d'une balise moyennant un certains nombre de critère .... mais à priori le besoin cité ici est plus poussé que ça !

    Si je reprend l'exemple donné :
    <h3><b>Films <h4>(33 réponses)</h4></b></h3>
    à partir De ça, on souhaite faire une requete qui renvoie la valeur "33".

    Arrêtez moi si je me trompe (et peut être que c'est le cas), mais xpath ou autre te permettra au mieux de récupérer comme réponse à ta requete la valeur "(33 réponses)" et non "33". Tu seras donc obliger que de refaire un traitement (regexp ou autre) pour extraire cette valeur de ta chaine.

    C'est pour cette raison que je met un doute sur l'utilité des parseurs HTML pour répondre à ce besoin.

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 64
    Points : 44
    Points
    44
    Par défaut
    Merci le element.getTextContent fonctionne bien
    Je me charge du traitement ^^

    PAr contre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <h3><b>Films <h4>(33 réponses)</h4></b></h3></td></tr></tbody></table>
    <table style="width: 445px;" border="0" cellpadding="0" cellspacing="0"><tbody><tr><td style="padding: 5px 5px 0pt;" valign="top">
    <table width="100%" border="0" cellpadding="0" cellspacing="0"><tbody><tr><td colspan="2" valign="top"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td style="padding: 0pt 5px 0pt 0pt; text-align: center;" width="60"><a href="/film/fichefilm_gen_cfilm=53762.html"><img src="http://a69.g.akamai.net/n/69/10688/v1/img5.allocine.fr/acmedia/rsz/60/x/x/x/medias/nmedia/18/35/26/67/18377766.jpg" style="border: 1px solid rgb(128, 128, 128);" width="60" border="0"></a></td><td valign="top"><h4><a href="/film/fichefilm_gen_cfilm=53762.html" class="link1">Bobby <b>Jones</b>, naissance d'une légende</a></h4><h5><a href="/film/fichefilm_gen_cfilm=53762.html" class="link4" style="color: rgb(128, 128, 128); text-decoration: none;">&nbsp;(Bobby <b>Jones</b>, stroke of genius)</a></h5><div style="padding-top: 2px;"><h4 style="color: rgb(128, 128, 128);">2003</h4></div><div style="padding-top: 2px;"><h5 style="color: rgb(128, 128, 128);">de Rowdy Herrington</h5></div><div style="padding-top: 2px;"><h5 style="color: rgb(128, 128, 128);">avec Jim Caviezel, Claire Forlani</h5></div></td></tr></tbody></table></td></tr><tr><td colspan="2" valign="top" height="1"><hr></td></tr><tr><td colspan="2" valign="top"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td style="padding: 0pt 5px 0pt 0pt; text-align: center;" width="60"><a href="/film/fichefilm_gen_cfilm=45890.html"><img src="http://a69.g.akamai.net/n/69/10688/v1/img5.allocine.fr/acmedia/rsz/60/x/x/x/medias/nmedia/18/63/95/41/18927496.jpg" style="border: 1px solid rgb(128, 128, 128);" width="60" border="0"></a></td><td valign="top"><h4><a href="/film/fichefilm_gen_cfilm=45890.html" class="link1">Indiana <b>Jones</b> et le Royaume du Crâne de Cristal</a></h4><h5><a href="/film/fichefilm_gen_cfilm=45890.html" class="link4" style="color: rgb(128, 128, 128); text-decoration: none;">&nbsp;(Indiana <b>Jones</b> and the Kingdom of the Crystal Skull)</a></h5><div style="padding-top: 2px;"><h4 style="color: rgb(128, 128, 128);">2008</h4></div><div style="padding-top: 2px;"><h5 style="color: rgb(128, 128, 128);">de Steven Spielberg</h5></div><div style="padding-top: 2px;"><h5 style="color: rgb(128, 128, 128);">avec Harrison Ford, Cate Blanchett</h5></div></td></tr></tbody></table></td></tr><tr><td colspan="2" valign="top" height="1"><hr></td></tr><tr><td colspan="2" valign="top"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td style="padding: 0pt 5px 0pt 0pt; text-align: center;" width="60"><a href="/film/fichefilm_gen_cfilm=29278.html"><img src="http://a69.g.akamai.net/n/69/10688/v1/img5.allocine.fr/acmedia/rsz/60/x/x/x/medias/nmedia/00/02/33/85/osmosisjones.gif" style="border: 1px solid rgb(128, 128, 128);" width="60" border="0"></a></td><td valign="top"><h4><a href="/film/fichefilm_gen_cfilm=29278.html" class="link1">Osmosis <b>Jones</b></a></h4><div style="padding-top: 2px;"><h4 style="color: rgb(128, 128, 128);">2001</h4></div><div style="padding-top: 2px;"><h5 style="color: rgb(128, 128, 128);">de Bobby Farrelly, Peter Farrelly</h5></div><div style="padding-top: 2px;"><h5 style="color: rgb(128, 128, 128);">avec Bill Murray, Molly Shannon</h5>....
    Je souhaite récupérer les adresses (de type /film/fichefilm_gen_cfilm=*.html) que dois je faire ?


    En fait element = (HTMLElement) doc.getElementsByTagName("h4").item(0);
    cela renvoie quoi ? je ne comprends pas trop....

    Désolé si je suis boulet ...

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2005
    Messages : 56
    Points : 43
    Points
    43
    Par défaut
    Je te conseille également les regexp qui sont plus adaptées (et probablement plus performantes) à tes besoins, j'ai du faire pareil il y a un petit moment et je ne regrette pas mon choix même si c'est foutrement chiant de mettre au point ses patterns !

    Vu le niveau de détails que tu veux atteindre, tout changement entrainera une maintenance plus ou moins lourde, regexp ou pas.

  14. #14
    Membre chevronné

    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Novembre 2006
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 252
    Points : 1 954
    Points
    1 954
    Par défaut
    Mais il est tout a fait possible d'exprimer des expressions régulières dans une requête XQuery. L'intérêt de la requête est d'avoir un support structuré, tu raisonne selon la filiation des éléments. Alors qu'une simple expression régulière amène à considérer tout le document comme un simple texte, ce qui est à mon sens moins sûr et fiable.

Discussions similaires

  1. Parser du HTML en utilisant Java
    Par zaz147 dans le forum Format d'échange (XML, JSON...)
    Réponses: 7
    Dernier message: 02/09/2008, 12h57
  2. parser un fichier html en utilisant java
    Par taouja dans le forum Services Web
    Réponses: 1
    Dernier message: 16/04/2007, 10h12
  3. [HELP] Modélisation d'un parser HTML
    Par dazulu dans le forum Langages de programmation
    Réponses: 11
    Dernier message: 31/07/2006, 01h03
  4. [Parser HTML] quel parser utiliser pour du HTML 4.0 ?
    Par Cyber@l dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 19/07/2004, 19h32

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