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

Bibliothèques tierces Python Discussion :

Parser du code HTML avec BeautifulSoup [Python 2.X]


Sujet :

Bibliothèques tierces Python

  1. #1
    Modérateur
    Avatar de BakSh0
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2014
    Messages
    276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2014
    Messages : 276
    Points : 1 271
    Points
    1 271
    Par défaut Parser du code HTML avec BeautifulSoup
    Bonjour,

    J'ai trouvé que les liens des résultats sur google étaient récupérable avec BeautifulSoup depuis un parsing tel que celui-ci :

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    parsing = BeautifulSoup(google.text, "html.parser")
    links = parsing.select("h3.r a")

    Récupérant ainsi toutes les balises "a" qui sont dans un "h3" de classe "r".

    Or si je cherche le premier résultat du domaine "google.com" avec le mot clé : "google" sur "google.fr", donc cette recherche :

    https://www.google.fr/search?q=google

    Je devrait avoir comme 2e lien "https://plus.google.com/?hl=fr", or avec cette recherche il va me trouver en 6e lien (car il me prends les 4 "sous-liens" de Google.fr qui sont également situé sous un h3 de classe "r") 4+2 = 6

    J'ai remarqué donc que la différence de ces liens est la présence d'une div "parente" de classe "sld vsc" pour les sous-liens et "rc" pour les liens qui m’intéressent.

    J'ai donc essayé de modifier la recherche par :

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    parsing.select("div.rc h3.r a")
    ou encore
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    parsing.select(".rc h3.r a")

    Mais il ne me retourne plus du tout de résultat, une idée ?
    BakSh0, Modérateur .Net & Web

    Affichez la colorisation syntaxique dans votre code en ajoutant dans votre balise : [CODE=xxx] en remplaçant xxx par le nom du langage.


    N'oubliez pas de consulter les FAQs : .Net / Web et les cours et tutoriels .Net / Web

  2. #2
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Août 2014
    Messages : 50
    Points : 58
    Points
    58
    Par défaut
    Bonjour.

    Ce module permet d'extraire des informations d'un fichier html ou xml ou bien d'une variable contenant la source.

    Il faut donc:

    Récupérer un fichier source de votre requête pour pouvoir isoler ce que vous cherchez.

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
     
    html_doc = """
    <html><head><title>The Dormouse's story</title></head>
    <body>
    <p class="title"><b>The Dormouse's story</b></p>
     
    <p class="story">Once upon a time there were three little sisters; and their names were
    <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
    <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
    <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
    and they lived at the bottom of a well.</p>
     
    <p class="story">...</p>
    """
    Running the “three sisters” document through Beautiful Soup gives us a BeautifulSoup object, which represents the document as a nested data structure:
     
    from bs4 import BeautifulSoup
    soup = BeautifulSoup(html_doc, 'html.parser')
     
    print(soup.prettify())
    # <html>
    #  <head>
    #   <title>
    #    The Dormouse's story
    #   </title>
    #  </head>
    #  <body>
    #   <p class="title">
    #    <b>
    #     The Dormouse's story
    #    </b>
    #   </p>
    #   <p class="story">
    #    Once upon a time there were three little sisters; and their names were
    #    <a class="sister" href="http://example.com/elsie" id="link1">
    #     Elsie
    #    </a>
    #    ,
    #    <a class="sister" href="http://example.com/lacie" id="link2">
    #     Lacie
    #    </a>
    #    and
    #    <a class="sister" href="http://example.com/tillie" id="link2">
    #     Tillie
    #    </a>
    #    ; and they lived at the bottom of a well.
    #   </p>
    #   <p class="story">
    #    ...
    #   </p>
    #  </body>
    # </html>
    Here are some simple ways to navigate that data structure:
     
    soup.title
    # <title>The Dormouse's story</title>
     
    soup.title.name
    # u'title'
     
    soup.title.string
    # u'The Dormouse's story'
     
    soup.title.parent.name
    # u'head'
     
    soup.p
    # <p class="title"><b>The Dormouse's story</b></p>
     
    soup.p['class']
    # u'title'
     
    soup.a
    # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>
     
    soup.find_all('a')
    # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
    #  <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
    #  <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
     
    soup.find(id="link3")
    # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>
    One common task is extracting all the URLs found within a page’s <a> tags:
     
    for link in soup.find_all('a'):
        print(link.get('href'))
    # <a href="http://example.com/elsie" target="_blank">http://example.com/elsie</a>
    # <a href="http://example.com/lacie" target="_blank">http://example.com/lacie</a>
    # <a href="http://example.com/tillie" target="_blank">http://example.com/tillie</a>

  3. #3
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 848
    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 848
    Points : 6 535
    Points
    6 535
    Par défaut
    Ça fonctionne parfaitement en ce qui me concerne, aussi bien div.rc h3.r a que .rc h3.r a comme on peut s'y attendre. Peut-être que le problème vient d'ailleurs, par exemple un blockage de la part du serveur. As-tu essayé avec la même page mais en local?

    Si le problème vient de là, essaye d'utiliser curl pour télécharger la page en renseignant le user Agent.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  4. #4
    Modérateur
    Avatar de BakSh0
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2014
    Messages
    276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2014
    Messages : 276
    Points : 1 271
    Points
    1 271
    Par défaut
    Merci CosmoKnacki pour ton test,

    Tu as testé depuis la page directement de google avec ton curl ? ou via un HTML que tu as fait pour cet exemple ?

    Pour récupérer le contenu de la page google j’utilise un requests.get()Je vais tester avec un curl.
    BakSh0, Modérateur .Net & Web

    Affichez la colorisation syntaxique dans votre code en ajoutant dans votre balise : [CODE=xxx] en remplaçant xxx par le nom du langage.


    N'oubliez pas de consulter les FAQs : .Net / Web et les cours et tutoriels .Net / Web

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 26/06/2016, 12h49
  2. comment parser du code HTML
    Par niouze dans le forum Général Dotnet
    Réponses: 1
    Dernier message: 12/01/2007, 11h28
  3. interpretation code html avec Persits.MailSender
    Par boss_gama dans le forum ASP
    Réponses: 11
    Dernier message: 07/07/2006, 11h41
  4. Parse code HTML avec PHP
    Par naourass dans le forum Langage
    Réponses: 3
    Dernier message: 19/05/2006, 09h12
  5. Insertion code html avec javascript
    Par totoranky dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 08/02/2006, 17h04

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