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

Réseau/Web Python Discussion :

Web Scraping - navigation a travers l'HTML [Python 3.X]


Sujet :

Réseau/Web Python

  1. #1
    Membre averti
    Homme Profil pro
    Country Finance Manager
    Inscrit en
    Juin 2014
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Country Finance Manager

    Informations forums :
    Inscription : Juin 2014
    Messages : 38
    Par défaut Web Scraping - navigation a travers l'HTML
    Bonjour le Forum,

    J'espère que vous allez bien ?!

    Je viens vers vous parce que je me casse la tête sur la navigation à travers le code HTML et BeautifulSoup.

    Je cherche à récupérer des données sur un site internet (date de publication et date de cloture des candidatures), sauf que les deux sont dans le même sous dossier "footer" sous le même nom "dd" et avec la même classe "datetime".

    Nom : Script HTML.png
Affichages : 1091
Taille : 20,3 Ko

    Je vous met mon code :
    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
    from datetime import date
    import bs4
    from urllib.request import urlopen as uReq
    from bs4 import BeautifulSoup as soup
    import os.path
    from datetime import date
     
    my_url='https://reliefweb.int/jobs?advanced-search=%28TY263.TY264%29_%28E261.E260%29_%28CC6864.CC20966.CC6867%29'
     
    # Opening a connection, grabbing the page
    uClient = uReq(my_url)
    # offloading the content into a variable
    page_html = uClient.read()
    # Closing
    uClient.close()
     
    # html parsing
    page_soup = soup(page_html,"html.parser")
     
    # Grab each product
    Jobs = page_soup.findAll("article",{"class":"job"})
     
    for job in Jobs:
        try:
            country = job.header.p.a.text
        except AttributeError:
            country = "none"
     
        description = job.header.h4.text 
        organisation = job.footer.dl.dd.ul.li.text
        posted = job.footer.dl.time['datetime']
        closing = job.footer.dl.time['datetime']
        link = job.header.h4.a['href']
    J'ai essayé la méthode Jobs[0].find_all("dd",{"date":"data-last"}) mais même si je me rapproche du résultat, je n'arrive pas à sélectionner la date exacte, et je ne suis pas sur que cette méthode soit viable si je change de page, puisque l'on fait référence à la liste de la page screenée (Je débute en Python).

    J'ai essayé de suivre le chemin proposé par le Xpath d'internet mais cela ne donne rien non plus, je sèche dans ce cas la

    Auriez-vous une piste ou un tuto qui expliquerait clairement comment faire en cas de doublon du nom dans un même répertoire (il y a énormement d'exemple sur internet mais je n'en ai trouvé aucun avec doublon).

    Merci d'avance pour votre aide,

    Bien cordialement,
    Thallhos

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Salut,

    Citation Envoyé par Thallhos Voir le message
    ...sauf que les deux sont dans le même sous dossier "footer" sous le même nom "dd" et avec la même classe "datetime".
    "datetime" n'est pas une classe...

    La première balise <dd> a deux classes : "date" et "posted" et la deuxième à une seule classe "date"...



    Citation Envoyé par Thallhos Voir le message
    mais même si je me rapproche du résultat, je n'arrive pas à sélectionner la date exacte
    Que veux-tu exactement est-ce le datetime : "2020-04-15T15:52:45+00:00" ou bien le texte : "15 Apr 2020" ?

  3. #3
    Membre averti
    Homme Profil pro
    Country Finance Manager
    Inscrit en
    Juin 2014
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Country Finance Manager

    Informations forums :
    Inscription : Juin 2014
    Messages : 38
    Par défaut
    Citation Envoyé par Beginner. Voir le message
    Salut,

    "datetime" n'est pas une classe...

    La première balise <dd> a deux classes : "date" et "posted" et la deuxième à une seule classe "date"...

    Que veux-tu exactement est-ce le datetime : "2020-04-15T15:52:45+00:00" ou bien le texte : "15 Apr 2020" ?

    Hello Beginner,

    Merci de ta réponse,

    Pour être plus clair :

    1. En fait j'aimerais cibler le date time de la classe 'date posted' et de la classe 'date', puis de le convertir en date.

    Quand j'écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    job.footer.dl.time['datetime']
    ca ne me cible j'ai l'impression que la première balise <dd> et donc 'date posted' et non 'date' (donc ca fonctionne pour la première mais pas la deuxième).

    J'ai essayé quelque chose comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    job.footer.dl.dd['posted'].time['datetime']
    mais ca ne donne rien non plus.


    2. J'aimerais comprendre comment naviguer dans un HTML avec des balises similaires pour aller cibler les infos précisement, si tu connais un bon tuto sur ce sujet je suis preneur, ou bien si tu as la patience de m'expliquer

    Un grand merci d'avance pour ton aide.

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Salut,

    Citation Envoyé par Thallhos Voir le message
    Quand j'écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    job.footer.dl.time['datetime']
    ca ne me cible j'ai l'impression que la première balise <dd> et donc 'date posted' et non 'date' (donc ca fonctionne pour la première mais pas la deuxième).
    Oui c'est normal avec cette notation il cherche, parmi les descendants de la balise job.footer.dl, la première balise time donc job.footer.dl.time revoie toujours la même balise même si tu l'utilises plusieurs fois...

    Citation Envoyé par Thallhos Voir le message
    2. J'aimerais comprendre comment naviguer dans un HTML avec des balises similaires pour aller cibler les infos précisement,
    Deux balises peuvent avoir plusieurs points communs mais elles ne sont jamais identiques (ne serait-ce à cause du fait qu'elles ont une position différente dans le DOM), il y a donc forcément moyen de les différencier, à nous de trouver lequel, il peut y avoir plusieurs possibilités... Tu peux voir ça comme un jeu...

    Voyons quelques possibilités pour ton exemple :

    1- On voit qu'il y a deux balises time dans la balise job or on peut récupérer ces deux balises dans une liste comme ceci : lst = job.findAll("time")...

    lst[0] contient la première balise et lst[1] la deuxième.

    Du coup tu peux récupérer les deux dates :
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    posted = lst[0]['datetime']
    closing = lst[1]['datetime']


    2- On voit que les deux balises qui nous intéressent ont un attribut "datetime", on peut donc se servir de ce critère pour récupérer les deux balises : lst = job.findAll(attrs={"datetime":True})...

    Le reste pareil qu'en 1...

    ---> Une remarque là on n'a pas besoin d'être plus précis mais si on voulait l'être on pourrait combiner le critères 1 (balise time) et le critère 2 (attribut "datetime").

    3- On voit qu'il y a trois balises dd dans la balise job, la première nous permettra de récupérer l'organisation comme tu le fais dans ton code et les deux autres qui suivent contiennent les deux balises time : on peut récupérer ces trois balises dans une liste comme ceci : lst = job.find_all('dd')...

    Du coup tu peux récupérer l'organisation et les deux dates :
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    organisation = lst[0].ul.li.text
    posted = lst[1].time['datetime']
    closing = lst[2].time['datetime']
    print(organisation, posted, closing, sep=" | ")

    J'ai testé ce petit bout de code et j'ai obtenu ça :
    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
    Internews | 2020-04-16T16:00:52+00:00 | 2020-05-15T00:00:00+00:00
    Chemonics | 2020-04-16T15:42:48+00:00 | 2020-04-23T00:00:00+00:00
    UNICEF | 2020-04-16T15:33:00+00:00 | 2020-05-03T23:55:00+00:00
    UNFPA | 2020-04-16T15:06:42+00:00 | 2020-05-08T00:00:00+00:00
    Chemonics | 2020-04-16T14:56:55+00:00 | 2020-04-23T00:00:00+00:00
    OAF | 2020-04-16T13:54:22+00:00 | 2020-05-16T00:00:00+00:00
    NCBA CLUSA | 2020-04-16T13:07:37+00:00 | 2020-05-01T00:00:00+00:00
    DRC | 2020-04-16T12:44:24+00:00 | 2020-05-06T00:00:00+00:00
    UNICEF | 2020-04-16T12:33:00+00:00 | 2020-04-29T20:55:00+00:00
    UNICEF | 2020-04-16T12:33:00+00:00 | 2020-04-30T19:25:00+00:00
    IOM | 2020-04-16T12:32:48+00:00 | 2020-04-30T00:00:00+00:00
    URI | 2020-04-16T12:02:45+00:00 | 2020-05-15T00:00:00+00:00
    URI | 2020-04-16T11:54:50+00:00 | 2020-05-15T00:00:00+00:00
    INTERSOS | 2020-04-16T11:22:38+00:00 | 2020-04-30T00:00:00+00:00
    FHI 360 | 2020-04-16T11:09:32+00:00 | 2020-05-16T00:00:00+00:00
    Plan | 2020-04-16T10:35:27+00:00 | 2020-05-03T00:00:00+00:00
    CRS | 2020-04-16T10:17:07+00:00 | 2020-05-15T00:00:00+00:00
    BBC Media Action | 2020-04-16T10:14:25+00:00 | 2020-05-03T00:00:00+00:00
    Mercy Corps | 2020-04-16T10:13:06+00:00 | 2020-05-16T00:00:00+00:00
    AECF | 2020-04-16T10:08:26+00:00 | 2020-04-28T00:00:00+00:00

    Citation Envoyé par Thallhos Voir le message
    si tu connais un bon tuto sur ce sujet je suis preneur, ou bien si tu as la patience de m'expliquer
    Je ne sais pas si il y a un bon tuto spécifiquement sur ça, c'est un sujet (la navigation DOM) plus général que BeautifulSoup ou selenium... Pour moi ces derniers reprennent ce qu'on voit en CSS/HTML/JS... Mais c'est vrai que j'ai vu que BeautifulSoup offre quand même des fonctionnalités assez puissantes...

    Citation Envoyé par Thallhos Voir le message
    ... ou bien si tu as la patience de m'expliquer
    Ben je t'ai donné trois façons de faire que j’espère être claires, essaye et dis-nous si cela fonctionne chez toi...
    Tu pourrais t'entrainer en cherchant et en testant d'autres façons (pour naviguer il y a les parents, les descendants, les frères...)...

  5. #5
    Membre averti
    Homme Profil pro
    Country Finance Manager
    Inscrit en
    Juin 2014
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Country Finance Manager

    Informations forums :
    Inscription : Juin 2014
    Messages : 38
    Par défaut
    Salut Beginner,

    Un grand merci pour ta réponse et tes explications très claires, superbe ta solution ca marche impec ! En fait de mon côté comme de toute façon je ne suis pas sur le format date de datetime soit exploitable, je suis parti sur un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    posted = job.find_all("dd",{"class":"date"})[0].text
                        closing = job.find_all("dd",{"class":"date"})[1].text
    qui ressemble exactement à ta technique mais on ciblant directement le texte, et plus tard dans ma base de données, je remplacerais les données texte et date, via une loop et une fonction si.


    Je vais creuser la navigation DOM, il y a beaucoup à faire sur ce sujet.

    Encore merci pour ton aide,
    Très bonne journée et à bientôt sur les forums
    Thallhos

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

Discussions similaires

  1. [HTML] Navigation entre des pages html
    Par chezdevelopping dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 16/01/2009, 11h30
  2. [Visual Web] [VWP] Navigation entre pages WEB
    Par david71 dans le forum NetBeans
    Réponses: 1
    Dernier message: 27/09/2007, 00h28
  3. [Web] modifier un fichier xml via HTML
    Par cyberfilou dans le forum APIs
    Réponses: 2
    Dernier message: 04/05/2007, 11h12
  4. Réponses: 2
    Dernier message: 11/04/2007, 14h35

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