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

Python Discussion :

Analyser et traiter un fichier


Sujet :

Python

  1. #1
    Invité
    Invité(e)
    Par défaut Analyser et traiter un fichier
    Bonjour !

    Voilà, je suis bloqué dans mon petit programme Python et j'ai besoin d'aide...

    J'aimerais que mon programme parse des pages HTML, récupère les URL contenues et les enregistre dans un fichier pour que ces même URL soient réutilisées pour êtres reparsées, etc...

    Pour ce qui est de l'extraction d'URL, je me suis aidé de l'exemple dans le guide de survie Python 3 (2e édition, Pearson), jusqu'ici ça marche, je me retrouve avec un fichier contenant, sur chaque ligne, les balises <a href =""> contenues dans les pages HTML.

    Là ou je bloque, c'est dans le "nettoyage" de ce fichier.

    En effet, je me retrouve avec des URL locales type <a href="/doc/av" title="">, or j'aurais souhaité faire en sorte de transformer ce fichier pour qu'il ne reste plus que sur chaque ligne une URL commençant par "http://" et se terminant par "html" ...

    Pouvez-vous m'aider s'il vous plait ? Je débute et je suis un peu embrouillé :-(

    Merci :-)

  2. #2
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Je ne sais pas trop ce que conseille de faire le guide de survie, mais personnellement j'utilise BeautifulSoup qui te permettra d'extraire directement les urls sans étape intermédiaire.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  3. #3
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    +1 pour Beautifulsoup!
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Citation Envoyé par RoKN311 Voir le message
    En effet, je me retrouve avec des URL locales type <a href="/doc/av" title="">, or j'aurais souhaité faire en sorte de transformer ce fichier pour qu'il ne reste plus que sur chaque ligne une URL commençant par "http://" et se terminant par "html" ...
    Est ce que la question est de "transformer" une chaine de caractère de la forme '<a href="/doc/av" title="">' en une autre chaîne de caractères de la forme 'http://doc/av.html' ?

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Invité
    Invité(e)
    Par défaut
    ah mais oui, beautifulsoup !
    Je vais regarder de ce côté là, mais en survolant la doc il me semble que c'est plus simple à mettre en place oui :-)

    Pour ce qui est du guide de survie, voici comment il explique l'extraction de liens d'un document HTML :

    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
    import html.parser
    import urllib.request, urllib.parse, urllib.error
    import sys
     
    fichierWrite = open("liens", 'w', encoding='utf-8')
     
    #Définition du parseur HTML
    class parseurLiens(html.parser.HTMLParser):
        def handle_starttag(self, tag, attrs):
            if tag == 'a':
                for name, value in attrs:
                    if name == 'href':
                        print(attrs)
                        fichierWrite.write(((self.get_starttag_text())))
                        fichierWrite.write("\n")
     
    #Création d'une instance du parseur HTML
    monParseur = parseurLiens()
     
    #Ouverture du fichier HTML
    data = urllib.request.urlopen("https://www.python.org"). read()
    monParseur.feed(data.decode('utf-8'))
    monParseur.close()
    fichierWrite.close()
    Je vais voir comment m'y prendre avec beautifulsoup et je mettrais ce sujet en résolu une fois fait.

    Merci !

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bon et bien c'est nickel, ça fonctionne très bien :-)
    Maintenant je me retrouve face a une nouvelle problématique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    listeUrls = []
    for anchor in soup.find_all('a'):
        listeUrls.append(anchor.get('href', '/'))
    Ce code rempli une liste mais il y a des sauts de ligne impromptus qui m'embêttent un peu...
    Par exemple, pour le site https://www.python.org/, la liste est remplie comme ça (chaque ligne est un élément) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    http://docs.python.org/devguide/
    http://bugs.python.org/
    https://mail.python.org/mailman/listinfo/python-dev
    http://pythonmentors.com/
    #python-network
    /about/help/
    /community/diversity/
    https://github.com/python/pythondotorg/issues
    /psf-landing/
    /about/legal/
    /privacy/
    Comment puis-je faire pour, soit ne pas décomposer les urls comme c'est le cas ici, soit virer les éléments ne commençant pas par "http" ou "https" ?

  7. #7
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    En fait tu peux filtrer les urls dés le départ avant même de les ajouter à ta liste:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    listeUrls = []
     
    for anchor in soup.findAll('a', {'href' : lambda x: x and x.startswith('http')}):
        listeUrls.append(anchor['href'])
     
    print(listeUrls)
    ou plus simplement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for anchor in soup.findAll('a'):
        if anchor['href'].lower().startswith('http'):
            listeUrls.append(anchor['href'])


    ou si tu veux être plus précis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for anchor in soup.findAll('a', {'href' : lambda x: x and (x.lower().startswith('http://') or x.lower().startswith('https://'))}):
    (après pour des sélections plus élaborées, si par exemple tu veux aussi récupérer les adresses ftp, sftp ou autre, tu peux remplacer les lower().startswith() par une expression régulière, ça évite d'avoir une ligne de 15km.)

    Tu aurais pu aussi le faire après coup en filtrant listeUrls avec la méthode filter() ou avec une liste comprehension. Mais bon, c'est mieux de sélectionner ce que tu veux plutôt que d'avoir à retirer ce que tu ne veux pas.

    À noter que BeautifulSoup est une surcouche logiciel qui permet d'utiliser facilement entre autre le parser html.parser. Utiliser BeautifulSoup au lieu d'utiliser html.parser directement est donc plus lourd.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  8. #8
    Invité
    Invité(e)
    Par défaut
    Oh super merci beaucoup !
    Je note, je vais explorer ça plus en profondeur mais je dois avouer que c'est pas simple du tout de savoir où et comment chercher tout seul quand on débute :-/
    Pour le moment je vais me contenter de beautifulsoup, un jour je reviendrais surement sur cette petite appli pour alléger un peu en passant directement à html.parser... mais chaque chose en son temps :-)

    L'idée finale de mon petit programme c'est d'afficher en continue, dans le terminal, le code source des pages html, récupérée au fil du web, de site en site... genre un parseur autonome si je puis dire, pour faire défiler du code.

    Ok, ça sert à rien, mais je suis sur que ça peut-être très détendant, genre comme ... comme un aquarium ? ...
    ...
    oui, bon, on se justifie comme on peut hein

    encore merci !

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

Discussions similaires

  1. lire et traiter un fichier XML avec XMLDOM
    Par Phiss dans le forum ASP
    Réponses: 14
    Dernier message: 13/02/2007, 16h47
  2. Impossible de traiter un fichier rptdesign avec Jasper
    Par nico_somb dans le forum Jasper
    Réponses: 3
    Dernier message: 31/08/2006, 10h01
  3. Réponses: 7
    Dernier message: 15/06/2006, 17h36
  4. [VB]Traiter un fichier avec EOF
    Par lox dans le forum VB 6 et antérieur
    Réponses: 17
    Dernier message: 01/02/2006, 08h51
  5. Traiter un fichier myd
    Par david71 dans le forum Installation
    Réponses: 2
    Dernier message: 11/12/2005, 13h12

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