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 : 34
    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
    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 actif
    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
    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 confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    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 986
    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.

  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 : 34
    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
    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, 11h49
  2. comment parser du code HTML
    Par niouze dans le forum Général Dotnet
    Réponses: 1
    Dernier message: 12/01/2007, 10h28
  3. interpretation code html avec Persits.MailSender
    Par boss_gama dans le forum ASP
    Réponses: 11
    Dernier message: 07/07/2006, 10h41
  4. Parse code HTML avec PHP
    Par naourass dans le forum Langage
    Réponses: 3
    Dernier message: 19/05/2006, 08h12
  5. Insertion code html avec javascript
    Par totoranky dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 08/02/2006, 16h04

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