• Je ne reviens ni sur la constitution de l'arbre par le parser lxml, ni sur la navigation dans l'arbre ni sur la recherche. J'explique ici comment modifier l'arbre à partir d'un exemple.

    Pour la réalisation de mon moteur de recherche de bougies parfumées, www.les-bougies.com il m'a fallu parfois extraire de blocs de texte les données textuelles pertinentes.

    La façon habituelle de procéder est d'identifier le bloc et de faire un get_text() mais si ce bloc contient du javascript on le récupère aussi. Il faut donc l'enlever au préalable.

    for x in bsObj.findAll('script'):

        bsObj.script.extract()

    On procède de la même façon pour remplacer, insérer, ...

    Contrairement à ce qu'on peut penser cette opération arrive de temps en temps pour des cas particuliers.

     


    votre commentaire
  • Reprenons notre exemple habituel : le site de bougies parfumées Scandles 

    Scandles est un site marchand Wordpress qui utilise l'extension commerce Woocommerce.

    Supposons que nous voulions extraire de la page produit, le prix et le titre de la bougie 

    from bs4 import BeautifulSoup

    import requests

     

    u="http://www.scandles.fr"

    html = requests.get(u)

    data = html.content

    bsObj = BeautifulSoup(data)

     

    Pour extraire le prix et le titre de la page que nous venons de lire il faut savoir où chercher. 

    Le plus simple est d'utiliser un inspecteur Web (celui de votre navigateur préféré) et de regarder comment sont balisés les titres et prix.

    Pour la page qui nous concerne, le titre est en h1 et le prix en <span class="amount">

    Essayons :

    bsObj.h1

    <h1 class="entry-title" itemprop="name">Le l\xe9opard de l\u2019Objet pour Scandles</h1>

    C'est bon pour le titre.

    bsObj.find("span",{"class":"amount"})

    <span class="amount">0.00\xa0\u20ac</span>

    Par contre ce n'est pas le cas pour le titre car il y a plusieurs <span class="amount"> dans le document.

    La preuve : 

     

    bsObj.findAll("span",{"class":"amount"})

     

    donne : 

     [<span class="amount">0.00\xa0\u20ac</span>, <span class="amount">41.00\xa0\u20ac</span>, <span class="amount">42.00\xa0\u20ac</span>, <span class="amount">85.00\xa0\u20ac</span>, <span class="amount">95.00\xa0\u20ac</span>, <span class="amount">100.00\xa0\u20ac</span>, <span class="amount">46.00\xa0\u20ac</span>, <span class="amount">90.00\xa0\u20ac</span>, <span class="amount">95.00\xa0\u20ac</span>, <span class="amount">124.00\xa0\u20ac</span>, <span class="amount">98.00\xa0\u20ac</span>, <span class="amount">95.00\xa0\u20ac</span>, <span class="amount">100.00\xa0\u20ac</span>, <span class="amount">85.00\xa0\u20ac</span>, <span class="amount">41.00\xa0\u20ac</span>, <span class="amount">42.00\xa0\u20ac</span>, <span class="amount">95.00\xa0\u20ac</span>, <span class="amount">55.00\xa0\u20ac</span>]

     Faisons différemment en attaquant plus haut. Le prix est aussi en <p class="large">

    bsObj.findAll("p",{"class":"large"})

    [<p class="price large"><span class="amount">100.00\xa0\u20ac</span></p>]

     

    C'est bon il n'y en a qu'un. On retient cette solution. On verra dans un autre post comment obtenir le prix en numérique.

     

     


    votre commentaire
  • BeautifulSoup permet de naviguer au sein de l'arbre créé lors de l'analyse syntaxique d'un document X(HTML).

    Après la création de l'objet BS4 : 

    from bs4 import BeautifulSoup

    import requests

    u="https://fr.wikipedia.org/wiki/Beautiful_Soup"

    soup = BeautifulSoup(requests.get(u))

     

    Pour écrire le contenu de la balise h1 : 

      

    soup.h1

     

    Ce qui donne comme résultat : 

     

    <h1 class="firstHeading" id="firstHeading" lang="fr"><span lang="en">Beautiful Soup</span></h1>

     

    Pour afficher le contenue de la première balise h2 : 

     

    soup.h2

     

    <h2><span class="mw-headline" id="Exemple_d.27utilisation">Exemple d'utilisation</span><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a class="mw-editsection-visualeditor" href="/w/index.php?title=Beautiful_Soup&amp;veaction=edit&amp;vesection=1" title="Modifier la section : Exemple d'utilisation">modifier</a><span class="mw-editsection-divider"> | </span><a href="/w/index.php?title=Beautiful_Soup&amp;action=edit&amp;section=1" title="Modifier la section : Exemple d'utilisation">modifier le code</a><span class="mw-editsection-bracket">]</span></span></h2>

     

    BS4 permet aussi de naviguer vers les ascendants, les descendants, les frères...les éléments suivants ou précédents.

    Ainsi : 

    soup.h1.next_element

     

    Retourne :

    <span lang="en">Beautiful Soup</span>

     

     

     


    votre commentaire
  • BeautifulSoup (BS4) est une bibliothèque (package) pour parser du HTML/XML. BS4 est écrit en Python.

    BS4 utilise par défaut le parser lxml mais vous pouvez en spécifier un autre (par exemple html5lib) D'ailleurs, si vous ne précisez pas votre parser vous avez ce message lors du lancement d'un script BS4.

    No parser was explicitly specified, so I'm using the best available HTML parser for this system ("lxml"). This usually isn't a problem, but if you run this code on another system, or in a different virtual environment, it may use a different parser and behave differently.

    Pour ma part, j'utilise lxml.

    Puisque BS4 ne parse pas les documents, que fait-il ?

    La réponse est sur le site :

    Beautiful Soup provides a few simple methods and Pythonic idioms for navigating, searching, and modifying a parse tree: a toolkit for dissecting a document and extracting what you need. It doesn't take much code to write an application.

    BS4 permet de naviguer au sein des éléments de l'arbre créé par le parser, d'effectuer des recherches ou des modifications sur ces éléments.

    BS4 actuellement en version 4.4.1 est disponible sur Python 2.6+ et Python 3. J'utilise Python 2.6. J'expliquerai dans un futur article comment l'installer.

    La documentation de BS4 disponible ici permet de comprendre facilement ce que fait BS4 :

    Nous aurons l'occasion d'y revenir en détail. 

    Un bref exemple pour commencer. Ce script permet d'extraire tous les liens de la première page du site marchand de bougies parfumées www.scandles.fr 

    import requests
    from bs4 import BeautifulSoup
    u = "http://www.scandles.fr"
    html = requests.get(u)
    data = html.content
    bsObj = BeautifulSoup(data)
    links=bsObj.findAll(« a »)

    Sans entrer dans les détails :  un GET permet d'obtenir la home page. Les données sont transformées en un objet BeautifulSoup (bsObj)

    La méthode findAll (searching the tree) permet de trouver tous les descendants de bsObj qui répondent au filtre ("a")

     

     

     


    votre commentaire
  • Mon 1er post est une brève présentation de ce que sera la teneur générale de ce blog. 

    Il s'agit avant tout de scraping du Web, c'est à dire de la collecte automatisée de données en provenance de sites Web et du traitement de ces données après analyse.

    Mes posts seront techniques, plutôt réservés à ceux qui sont familiers du Web, d'Apache, MySQL, XML, HTML, Python, ... 

    Pour illustrer mes articles je m'appuierai sur un moteur de recherche que j'ai développé www.les.bougies.com .

    Ce moteur scanne périodiquement les sites marchands spécialisés dans la vente de bougies parfumées et met à jour la base de données du site Wordpress www.les.bougies.com afin de permettre de lister sur le site une bonne partie de l'ensemble des produits commercialisés sur ces sites.

    Par exemple, le site Scandles est scanné chaque jour et les produits du site sont visibles sur le moteur www.lesbougies.com 

     Je ne m'attarderai pas sur le site, qui est relativement classique, car développé grâce au CMS Wordpress. Je consacrerai plutôt mes articles au robot qui alimente ce site.

    Le prochain article sera donc consacré à BeautifulSoup !

     


    votre commentaire



    Suivre le flux RSS des articles
    Suivre le flux RSS des commentaires