Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Pyhton3] Parser HTML

Sujet résolu
    28 octobre 2011 à 12:33:58

    Salut,

    après pas mal de recherches je ne trouve aucun parser html qui me convient.
    La doc de la classe HtmlParser, je ne la comprends que trop peu, les expressions régulières je les laisse en stand-by car c'est un peu chiant, et beautifulSoup n'est pas compatible avec Python 3.2
    En gros je cherche à récupérer des valeurs d'une page web:
    <input type="{0}" name="{1}" value="{2}">
    

    En gros je voudrais récupérer toutes les valeurs 0, 1 et 2 des input d'un <form>.


    Merci :)
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      28 octobre 2011 à 12:39:32

      Avec les re, c'est pas chiant, tiens en 3 minutes

      >>> chaine = """<input type="{0}" name="{1}" value="{2}">"""
      >>> import re
      >>> pattern = "{\d}"
      >>> num = re.findall(pattern, chaine)
      >>> print(num)
      ['{0}', '{1}', '{2}']
      


      On peut utiliser beautifulSoup avec la version 3 python

      • Partager sur Facebook
      • Partager sur Twitter
        28 octobre 2011 à 12:46:06

        Merci, mais beautifulSoup je n'ai pas réussi à l'installer, toujours des erreurs au moment du build/install.
        Les valeurs {0} {1} et {2} étaient juste des exemples, comment adapter le script pour obtenir une liste des noms/valeurs de tout les inputs ?
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          28 octobre 2011 à 12:48:57

          Tu as bien utilisé la version 3.1?

          Edit : Sinon tu peux utiliser html5lib, elle est conseillée sur le site beautifulSoup, si tu as des problèmes avec.

          • Partager sur Facebook
          • Partager sur Twitter
            28 octobre 2011 à 12:51:27

            Non j'utilise Python 3.2 mais le 3.1 est installé également.
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              28 octobre 2011 à 12:56:01

              Je parle de la version 3.1 de BeautifulSoup

              Pour les re, cherche un peu toi même et propose un code ;)

              Solution possible avec les re, mais c'est pas ma spécialité, il faut aller fouiner dans la doc.

              >>> pattern = "(\w+=\"{\d}\")"
              >>> num = re.findall(pattern, chaine)
              >>> print(num)
              ['type="{0}"', 'name="{1}"', 'value="{2}"']
              >>> print('\n'.join(num))
              type="{0}"
              name="{1}"
              value="{2}"
              
              • Partager sur Facebook
              • Partager sur Twitter
                28 octobre 2011 à 13:07:47

                Merci, je vais essayer de comprendre le code. :)

                Edit: La regex ne fonctionne pas pour mes valeurs actuelles. J'ai essayée de l'adaptée mais sans succès :
                chaine = """<input type="hidden" name="test" value="valeurtest"/>"""
                pattern = "(\w+=\"\w\")"
                
                • Partager sur Facebook
                • Partager sur Twitter
                  30 octobre 2011 à 23:08:24

                  Il faudrait (au minimum car j'aurai tendance à remplacer le \w par [^"], sans oublier que pour les régex c'est en général plus pratique de préfixer les chaînes avec r pour éviter les problèmes avec les antislash) rajouter un + (ou un *) après le deuxième \w car là tu ne matches qu'un caractère ;)
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    31 octobre 2011 à 11:08:57

                    Citation

                    Edit: La regex ne fonctionne pas pour mes valeurs actuelles. J'ai essayée de l'adaptée mais sans succès :



                    pattern = "(\w+=\"\w+\")"
                    • Partager sur Facebook
                    • Partager sur Twitter
                      31 octobre 2011 à 15:18:41

                      Salut, j'ai trouvé une solution avec lxml :)
                      import lxml.html
                      chaine = '''
                      <form action="" method="">
                      <input type="hidden" name="lol" value="test">
                      </form>
                      '''
                      h = lxml.html.fromstring(page);
                      for cle, i in h.forms[0].values():
                          print(cle, i)
                      • Partager sur Facebook
                      • Partager sur Twitter

                      [Pyhton3] Parser HTML

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown