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 :

bs4 balise insaisissable


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 651
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut bs4 balise insaisissable
    Bonjour,

    je ne parviens pas à attraper la valeur d'un attribut.

    voici le html simplifié :
    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
    <!DOCTYPE html>
    <html>
     <head>
      <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
     </head>
     <body>
      <p hidden="hidden">
       <!--
    <TITLE>Login</TITLE>
    <a href="jpg.html">LIVE JPEG</a><br>
    <a href="liveie.html">Internet Monitor (Microsoft Internet Explorer 8, 9, 10, 11) </a><br>
    <a href="DVRRemoteAP.exe">Download 32 bits DVR Client (Windows 7, Windows 8, Windows 10)</a><br>
    <a href="DVRRemoteAP_X64.exe">Download 64 bits DVR Client (Windows 7, Windows 8, Windows 10)</a><br>
    <a href="DVFPlayer.zip">Download 32/64 bits File Player (Windows 7, Windows 8, Windows 10)</a><br>
    <\?xml version="1.0" encoding="utf-8"?><base64Binary xmlns="http://micros-hosting.com/EGateway/">
    Location: /admin
    <meta name="generator" content="vBulletin 5.5.4" />
    ...
    base64Binary</base64Binary>
    ...
    </body></html>
    je voudrais la valeur de base64Binary xmlnsje m'y prend ainsi (je mets find_all pour montrer la liste vide)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    from bs4 import BeautifulSoup as bs
    with open('/home/nbah/fichier.html', "r") as f:
        content = f.read()
    soup = bs(content,'html.parser')
    soup.find_all('base64Binary', attrs={'xmlns'})
    et j'obtiens
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> 'base64Binary' in content
    True
    est-ce parce ce que la balise est dans un commentaire ? et/ou comment faire ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  2. #2
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 323
    Par défaut
    bonjour

    en effet , le plus simple est de supprimer les commentaires (sinon: extraire les commentaires de la balise p puis les re-parser dans soup comme si c'était un autre fichier html)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    content = content.replace("<!--", "").replace("-->", "")
    Puis une recherche css : balise "base64Binary" qui est dans p avec un attribut hidden
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    soup.select('p[hidden] base64Binary')
    note: soup.select_one() est peut-être plus adéquate ?

  3. #3
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 651
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    je fais d'autres tests

    je peux trouver la première balise a sans replace() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> soup.find('a')
    <a href="jpg.html">LIVE JPEG</a>
    je peux trouver la balise meta qui suit base64Binary, toujours sans replace() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> soup.find('meta',{'name': 'generator'})
    <meta content="vBulletin 5.5.4" name="generator"/>
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 323
    Par défaut
    Désolé, c'est en fait la combinaison des 2 (ne me demande pas pourquoi je suppose que base64Binary n'est pas un tag valide pour bs4)

    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
    from bs4 import BeautifulSoup as bs
    content="""
    <!DOCTYPE html>
    <html>
    <head><meta content="text/html; charset=utf-8" http-equiv="Content-Type"/></head>
    <body>
      <p hidden="hidden">
      <!--
         <a href="jpg.html">LIVE JPEG</a><br>
         <\?xml version="1.0" encoding="utf-8"?><base64Binary xmlns="http://micros-hosting.com/EGateway/">
      -->
      caché
      </p>
      <p>Visible</p>
    </body></html>
    """
     
    # si comment : ne touve jamais
    content = content.replace("<!--","").replace("-->","")
     
    soup = bs(content,'html.parser')
    x = soup.find('a')
    print('a find', x)
     
    x = soup.find('base64Binary')
    print('64B find', x)   # trouve jamais, comment ou pas
     
    x = soup.select_one('base64Binary')
    print("64B select", x.attrs)   # trouve uniquement si pas de commentaires
    ps: perso j'utilise toujours select() plutôt que find()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select('p[hidden] base64Binary')
    select('base64Binary[xmlns]')
    select('base64Binary[xmlns*="micros-hosting"]')

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

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 215
    Par défaut
    Hello,
    je ne vois pas dans ton fichier la fermeture de la balise base64Binary ?
    Ami calmant, J.P

  6. #6
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 323
    Par défaut
    tout a fait, on n'a pas non plus de fin de commentaire dans l'exemple original
    mais, même en fermant la balise, seul select() trouve

    EDIT: merci jurassic pork en effet soup.find('base64binary') est OK - raison de plus pour moi, de préférer select()

  7. #7
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 651
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    Citation Envoyé par jurassic pork Voir le message
    je ne vois pas dans ton fichier la fermeture de la balise base64Binary ?
    elle y est bien dans le fichier, je l'ai ajouté à mon premier message.
    Citation Envoyé par papajoker
    tout a fait, on n'a pas non plus de fin de commentaire dans l'exemple original
    elle, par contre je ne l'ai pas trouvée.
    la seule fin de commentaire trouvée correspond à un autre commentaire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    x = soup.select_one('base64Binary')
    print("64B select", x.attrs)
    ah, c'est le .attrs qui me manquait !
    je voyais tout le blabla de la balise, et je ne parvenais pas à voir l'attribut.

    merci.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

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

Discussions similaires

  1. balises identiques
    Par Phmichel dans le forum XML/XSL et SOAP
    Réponses: 8
    Dernier message: 28/10/2002, 09h18
  2. Balises HTML dans un fichier XML
    Par Bastet79 dans le forum XML/XSL et SOAP
    Réponses: 12
    Dernier message: 04/09/2002, 15h29
  3. [Documentation][XSLT][XSLFO]Les balises xslfo
    Par Lydiane dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 14/08/2002, 11h31
  4. [XSLT] inclure du XSL dans une balise html
    Par iaa dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 05/08/2002, 15h57

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