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 :

Scraping : Problème de recherche dans une balise <a> [Python 3.X]


Sujet :

Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Jeune ingénieur
    Inscrit en
    Janvier 2020
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Jeune ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2020
    Messages : 6
    Points : 6
    Points
    6
    Par défaut Scraping : Problème de recherche dans une balise <a>
    Bonjour,

    Je débute en scraping au travers de vidéos, malheureusement je n’obtiens pas le même résultat que sur l'une d'entre elle.

    Je tente de récupérer le contenu de href dans une balise html <a> qui correspond à la variable a, dans le code, voici la balise :

    Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
    <a class="travian-color" href='https://www.inactivesearch.it/analyse/ts8.x1.europe.travian.com/player/4059'>BET</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
    import requests
    from bs4 import BeautifulSoup
     
    url = 'https://www.inactivesearch.it/analyse/ts8.x1.europe.travian.com/alliance/395'
     
    r = requests.get(url)
     
    if r.ok:
      links = []
      soup = BeautifulSoup(r.text, features="html.parser")
      tds = soup.findAll('td')
      for td in tds:
          a = td.find('a')
          link = a['href']
          links.append(link)
      print(links)
    Et à l'exécution de celui-ci, je récupére l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Traceback (most recent call last):
      File "C:/Users/ISEN/PycharmProjects/scrapping/venv/scrap1.py", line 15, in <module>
        link = a['href']
    TypeError: 'NoneType' object is not subscriptable
    Je ne comprends pas d'où peut venir l'erreur, pourriez-vous m'aider sur ce sujet ?

    Merci d'avance
    Bonne journée
    Bastien

  2. #2
    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 Tekmate Voir le message
    Je ne comprends pas d'où peut venir l'erreur, pourriez-vous m'aider sur ce sujet ?
    A priori, a = td.find('a') va trouver ou pas... la balise "a" et s'il ne la trouve pas, il retournera None. Et à la ligne suivante, l'instruction link = a['href'] se vautre.

    Plutôt que de recopier le code depuis des vidéos, ouvrez un tuto. apprenez à programmer en essayant de faire les exercices car on passe plus de temps à relire/lire du code qu'à l'écrire.

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

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Jeune ingénieur
    Inscrit en
    Janvier 2020
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Jeune ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2020
    Messages : 6
    Points : 6
    Points
    6
    Par défaut
    Bonjour,

    Je te remercie pour ta réponse rapide.

  4. #4
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 954
    Points : 9 284
    Points
    9 284
    Par défaut
    hello,
    Citation Envoyé par Tekmate Voir le message
    Bonjour,

    Je débute en scraping au travers de vidéos, malheureusement je n’obtiens pas le même résultat que sur l'une d'entre elle.

    Je tente de récupérer le contenu de href dans une balise html <a> qui correspond à la variable a, dans le code, voici la balise :

    Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
    <a class="travian-color" href='https://www.inactivesearch.it/analyse/ts8.x1.europe.travian.com/player/4059'>BET</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
    import requests
    from bs4 import BeautifulSoup
     
    url = 'https://www.inactivesearch.it/analyse/ts8.x1.europe.travian.com/alliance/395'
     
    r = requests.get(url)
     
    if r.ok:
      links = []
      soup = BeautifulSoup(r.text, features="html.parser")
      tds = soup.findAll('td')
      for td in tds:
          a = td.find('a')
          link = a['href']
          links.append(link)
      print(links)
    Et à l'exécution de celui-ci, je récupére l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Traceback (most recent call last):
      File "C:/Users/ISEN/PycharmProjects/scrapping/venv/scrap1.py", line 15, in <module>
        link = a['href']
    TypeError: 'NoneType' object is not subscriptable
    Je ne comprends pas d'où peut venir l'erreur, pourriez-vous m'aider sur ce sujet ?
    Comme le dit wiztricks le souci c'est que la balise a n'est pas forcément présente dans les balises td et que dans ce cas l'objet a reste à None ce qui engendre l'erreur qui est affichée sur la ligne suivante. Il faut donc tester si la valeur de a n'est pas à None. Il faut aussi tester si l'objet a à un attribut href pour éviter une nouvelle erreur.
    On peut faire comme ceci par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        tds = soup.findAll('td')
        for td in tds:
            a = td.find('a')
            if a is not None and a.has_attr('href'):
                link = a['href']
                links.append(link)
        print(links)
    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par jurassic pork Voir le message
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if a is not None and a.has_attr('href'):
    	link = a['href']
    	links.append(link)
    Je me demande si l'opérateur morse fonctionnerait ici...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if a is not None and link:=a.get("href") is not None:
    	links.append(link)
    (peux pas tester, mon Python n'a pas encore le niveau pour cet opérateur mais d'après ce que j'en sais, ça semble cohérent...)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    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,

    Il faut ajouter des parenthèses astucieusement sinon çà va assigner à link un booléen (le résultat de l'expression a.get("href") is not None). Un machin comme a is not None and link:=a.get("href") is not None se simplifie en a and (link:=a.get("href"))

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

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

Discussions similaires

  1. Problème de recherche dans une table
    Par Asdorve dans le forum Langage SQL
    Réponses: 9
    Dernier message: 20/02/2009, 15h07
  2. Problème de recherche dans des balises XML
    Par mbhfr06 dans le forum Langage
    Réponses: 2
    Dernier message: 26/08/2007, 11h26
  3. problème de recherche dans une base de donnée mysql
    Par Xini28 dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 24/10/2005, 18h00
  4. problème de recherche dans une base de données
    Par bouzid_mehdi dans le forum Bases de données
    Réponses: 2
    Dernier message: 19/07/2005, 06h47
  5. Problème de recherche dans une BD
    Par ledevelopeur dans le forum Bases de données
    Réponses: 5
    Dernier message: 28/04/2004, 09h49

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