Forum Programmation.python Compter les tags HTML d'une page

Posté par . Licence CC by-sa
1
30
juin
2015

Hello,

Je cherche, comme le titre l'indique, à compter les différents TAG d'un fichier HTML que je retrouverai dans un tableau du style :

a 32
p 69
div 211

J'ai commencé à chercher quel langage utilisé, j'ai eu plusieurs pistes dont Python et PHP. En regardant du côté de Python je suis tombé sur beautifulsoup qui m'a l'air super puissant. Mais n'est-ce pas trop overkill ?

Le souci principal est que je n'ai pas de réelle connaissance en python, j'ai donc peur d'être bloqué rapidement même si je pense que le script que je cherche à faire n'est pas très compliqué.
Je suis donc parti sur cette base de code, mais là je bloque un peu

import urllib2
    from BeautifulSoup import BeautifulSoup

    url = urllib2.urlopen("http://www.lequipe.fr")

    content = url.read()

    soup = BeautifulSoup(content)

    tag = soup.findAll()

Si quelqu'un pouvait me guider, ou m'orienter vers une solution un peu plus facile (pas de grande connaissance en programmation..). Je cherche à apprendre un peu pour me faciliter la vie.

Cordialement,

  • # outils unix

    Posté par . Évalué à 3.

    C'est pour un exercice ou bien pour un besoin réel ?
    parce que, en y passant moins de 5 min, ca se fait en une ligne avec grep, sed, sort et uniq

    • [^] # Re: outils unix

      Posté par . Évalué à 1.

      C'est pour moi, un petit exercice. En fait on est plusieurs amis à se lancer des petits exos pour "monter" en compétence.
      J'ai hérité de celui-là. J'avais pensé à ce que tu mentionnes, mais je n'ai pas plus creusé que ça vu que je suis tombé sur beautifulsoup qui m'avait l'air bien.

      • [^] # Re: outils unix

        Posté par . Évalué à 2. Dernière modification le 30/06/15 à 14:44.

        alors je te laisse le plaisir de la découverte :)
        mais à mon sens, beautifulsoup semble effectivement de l'artillerie lourde pour ce que tu cherches à obtenir

        • [^] # Re: outils unix

          Posté par . Évalué à 1.

          Ouep merci du conseil, je connais un peu ! J'avais été surpris de la "puissance" quand c'est maitrisé. J'vais donc creuser ça & merci !

    • [^] # Re: outils unix

      Posté par . Évalué à 2.

      Je doute que cela soit si simple avec grep… (Comment prendre en compte une balise répétée plusieurs fois sur la même ligne par exemple).

      • [^] # Re: outils unix

        Posté par . Évalué à 3.

        je n'ai jamais dit que ça se faisait uniquement avec grep

        • [^] # Re: outils unix

          Posté par . Évalué à 2.

          Merci, j'ai bien lu : grep, sed, sort et uniq. Mais j'ai beau chercher je ne vois pas comment cela est possible.

          • [^] # Re: outils unix

            Posté par . Évalué à 2.

            coupe, filtre, trie, et compte

            • [^] # Re: outils unix

              Posté par . Évalué à 1. Dernière modification le 30/06/15 à 15:22.

              Ca donnerait quelque chose comme ça (là ça ne marche pas, j'suis en train de voir) :

              sed '/<[^>]+>/' index.html | sort | uniq -c

              Suis-je sur la bonne piste ?

              • [^] # Re: outils unix

                Posté par . Évalué à 2.

                si on oublie les erreurs dans la regexp, ce que tu fais c'est: filtre, trie, compte
                donc il te manque une étape

                Mais pour aller dans le sens de bruno, le grep que j'ai utilisé est superflu: ça se fait aussi avec sed, sort et uniq, puisqu'un grep peut aussi s'exprimer sous forme d'un sed; mais je n'ai pas cherché plus loin que la solution la plus intuitive pour moi

                • [^] # Re: outils unix

                  Posté par . Évalué à 1.

                  Donc il me manque le "coupe", je pense essayer de le faire avec le sed puisque je ne vois pas comment le "grep" peut m'aider. Je pense juste que c'est un manque d'expérience pour voir plus loin à ce niveau là.
                  Concernant ma regex, elle à l'air fonctionnelle sur les différents site de test. Je prend ce qui commence par < suivi d'au moins un caractère à plusieurs qui n'est pas > et le tout se termine par >. Il faut peut être que j'enlève le fait d'avoir une balise fermante peut être non ?

                  • [^] # Re: outils unix

                    Posté par . Évalué à 2.

                    1/les tags sont limités à certains caractères
                    2/en regexp standard (et non extended) ton + doit être précédé d'un \ pour indiquer qu'il ne s'agit pas du caractère mais d'une multiplicité
                    3/si tu as des tags avec des attributs différents tu vas récupérer une ligne par combinaison tag+attributs

                    je mets ma solution ici

                    libre à toi de la consulter quand tu le souhaiteras

                    • [^] # Re: outils unix

                      Posté par . Évalué à 1.

                      D'accord, je commence à y voir clair !

                      Du coup, effectivement je fais des regex "PCRE". La différence n'est pas encore très bien assimilée de ce côté-ci d'où les "petites erreurs".

    • [^] # Re: outils unix

      Posté par (page perso) . Évalué à 4.

      Tu n'es quand-même pas en train de recommander d'analyser du HTML avec des expressions rationnelles? :)

      • [^] # Re: outils unix

        Posté par (page perso) . Évalué à 1.

        Il est question de comptage et non de parsing complexe. Donc les outils en ligne de commande semblent tout à fait adaptés. Faut il sortir libxml2 et xslt ?

        • [^] # Re: outils unix

          Posté par (page perso) . Évalué à 3. Dernière modification le 01/07/15 à 19:54.

          Je suis certainement le premier à utiliser Unix pour résoudre un problème, mais si je veux extraire la ligne de tags de quelque chose comme

          <a
          href="http://pasla"
          >Un guillemet"<
          img
           alt="Un chevron<"
           src="http://ailleurs" /></a>
          

          avec du sed et bien il va falloir par commencer par nettoyer très soigneusement l'entrée.

          Sans aller jusqu'à utiliser (explicitement) une bibliothèque adaptée je pense que le passage par un des outils de onsgmls ou bien par tidy est à recommander.

          Exemple de output de onsgmls

          (HTML
          (HEAD
          AREL CDATA stylesheet
          AHREF CDATA style.css
          ATYPE CDATA text/css
          (LINK
          ACONTENT CDATA text/html; charset=iso-8859-1
          AHTTP-EQUIV CDATA Content-Type
          (META
          AREL CDATA Start
          AHREF CDATA index.html
          ATYPE IMPLIED
          (LINK
          AREL CDATA Appendix
          AHREF CDATA index_types.html
          ATYPE IMPLIED
          ATITLE CDATA Index of types
          (LINK
          AREL CDATA Appendix
          AHREF CDATA index_values.html
          ATYPE IMPLIED
          ATITLE CDATA Index of values
          (LINK
          AREL CDATA Appendix
          AHREF CDATA index_modules.html
          ATYPE IMPLIED
          ATITLE CDATA Index of modules
          

          Après si il y a une bonne raison de tout faire n'importe comment, c'est chacun comme il veut.

          • [^] # Re: outils unix

            Posté par . Évalué à 2.

            c'est vrai qu'avec la solution que je propose, le cas du tag qui s'étale sur 2 lignes ne sera pas pris en compte… mais ça peut se négocier :)

            D'un autre coté , l'idée est de "monter en compétence", donc l'utilisation d'un outil tout prêt ne me semble pas être ce que Bobmoutarde demande.
            En utilisant les outils UNIX, il peut se former sur UNIX et les regexps.
            En utilisant python, comme proposé à l'origine, il peut se forme sur le langage et/ou certaines bibliothèques.

            • [^] # Re: outils unix

              Posté par (page perso) . Évalué à 2.

              c'est vrai qu'avec la solution que je propose, le cas du tag qui s'étale sur 2 lignes ne sera pas pris en compte… mais ça peut se négocier :)

              Oh oui, je pense qu'avec un script sed bien poilu, on pourrait presque à faire onsgmls sur du HTML! :D

              D'un autre coté , l'idée est de "monter en compétence", donc l'utilisation d'un outil tout prêt ne me semble pas être ce que Bobmoutarde demande.

              Oui bien sûr, mais c'est bien de savoir que certains outils ont leur limites, et l'idée qu'on peut utiliser des expressions rationnelles pour analyser le HTML, c'est comme le chiendent, il vaut mieux s'en débarrasser le plus vite possible. C'est pas comme si analyser du HTML était la seul chose qu'on pouvait faire avec du texte!

              Par exemple, on peut extraire des données des pages HTML avec de expressions rationnelles. Si il cherche du texte pour rentrer dans la moulinette, il peut prendre des livres (Gutenberg Project), faire du sqlite3 + shell, etc.

              http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454

  • # sur stackoverflow

    Posté par (page perso) . Évalué à 2.

    2 exemples

    http://stackoverflow.com/questions/27673644/beautifulsoup-counting-tags-without-parsing-deep-inside-them

    http://stackoverflow.com/questions/13853025/is-there-a-way-in-beautiful-soup-to-count-the-number-of-tags-in-a-html-page

    If you choose open source because you don't have to pay, but depend on it anyway, you're part of the problem.evloper) February 17, 2014

  • # XPath ?

    Posté par (page perso) . Évalué à 4.

    XPath, par exemple avec /usr/bin/xpath de libxml-xpath-perl (chez Debian)

  • # Solution avec onsgmls

    Posté par (page perso) . Évalué à 3.

    Utilise le programme onsgmls de Jim Clark pour normaliser ton document

    % onsgmls index.html 2>&- | sed -n -e 's/^(//p' | sort | uniq -c
       4 A
       1 BODY
       2 BR
       1 DIV
       1 H1
       1 HEAD
       1 HTML
       3 LI
       6 LINK
       1 META
       1 TABLE
       2 TD
       1 TITLE
       1 TR
       1 UL

    Comme écrit plus haut la sortie de onsgmls ressemble à ça:

    % onsgmls index.html 2>&- 
    (HTML
    (HEAD
    AREL CDATA stylesheet
    AHREF CDATA style.css
    ATYPE CDATA text/css
    (LINK
    ACONTENT CDATA text/html; charset=iso-8859-1
    AHTTP-EQUIV CDATA Content-Type
    (META
    AREL CDATA Start
    AHREF CDATA index.html
    ATYPE IMPLIED
    (LINK
    AREL CDATA Appendix
    AHREF CDATA index_types.html
    ATYPE IMPLIED
    ATITLE CDATA Index of types
    (LINK
    AREL CDATA Appendix
    AHREF CDATA index_values.html
    ATYPE IMPLIED
    ATITLE CDATA Index of values
    (LINK

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.