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 :

comment purifier une page web des script ?


Sujet :

Python

  1. #1
    Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    221
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 221
    Points : 61
    Points
    61
    Par défaut comment purifier une page web des script ?
    Bonjour ;
    Je suis entrain de purifier une page web de toutes les balise html, et aussi les script, pour les balise html c'est déja fait pour les scrit j'arrive pas a les enlever, je souhaite enlever tout le contenu qui existe entre une balise " <script> contenu </script> " voici mon bout de code, comment je peux lui dire d'enlever tout le contenu des script merci

    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
     
    # -*- coding: cp1252 -*-
    import nltk
    import re
    import urllib2
    from urllib2 import urlopen
     
    import cookielib
    from cookielib import CookieJar
    import time
     
    print "khadi"
     
    cj=CookieJar()
    opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
    opener.addheaders=[('User-agent','Mozilla/5.0')]
    f = open("C:\\Users\\khadi\\Desktop\\corpus\\sport.txt", "rU").read();
     
     
    tab = f.split("\n")
     
     
    di = nltk.FreqDist()
    #nbr = 0;
    tablien = []
    for line in tab:
        #if line.startswith("http"):
            lien = line
            print line
     
            sourceCode=opener.open(line).read()
     
            fichier1 = open ("sprt.txt", "w")
            texte = re.sub("é","e",sourceCode)
            texte = re.sub("&eacute;","e",sourceCode)
            texte = re.sub("&egrave;","e",sourceCode)
            texte = re.sub("&ecirc;","e",sourceCode)
            texte = re.sub("&icirc;","i",sourceCode)
            texte = re.sub("&agrave","a",sourceCode)
            texte = re.sub("&acirc","a",sourceCode)
            texte = re.sub("ocirc;","o",sourceCode)
            texte = re.sub("&nbsp;"," ",sourceCode)
            texte = re.sub("&quot;","'",sourceCode)
     
     
          #  texte = re.sub("<Script.*?</Script>"," ",sourceCode)
            texte = re.sub("<.*?>","",sourceCode)
            #texte = re.sub("^function(.*?){|$}","",sourceCode)
     
            fichier1.write(texte)
            print texte

  2. #2
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2010
    Messages : 553
    Points : 2 740
    Points
    2 740
    Par défaut
    Salut,

    le premier truc qui va pas dans ton script, c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    texte = re.sub(""","'",sourceCode)
    il faut:
    • soit échapper le double-quote du milieu afin qu'il ne soit pas interprété
    • soit le mettre entre simple-quote

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    texte = re.sub("\"","'",sourceCode)
    # ou
    texte = re.sub('"',"'",sourceCode)
    ensuite, pour virer tous les scripts, j'aurais tendance à utiliser ton expression régulière commentée
    texte = re.sub("<Script.*?</Script>"," ",sourceCode)
    mais en spécifiant les options qui vont bien pour que la recherche...
    1. puisse se faire sur plusieurs lignes
    2. ignore la casse
    3. inclue les sauts de ligne dans le joker "."

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    texte = re.sub(r"<Script.*</Script>", " ", sourceCode, flags=re.IGNORECASE | re.MULTILINE | re.DOTALL)
    le problème est maintenant que les expressions régulières ont tendance à sélectionner le plus grand texte possible qui vérifie la patten et que l'expression régulière ci-dessus sélectionne tout ce qui se trouve entre la première balise ouvrante <script> et la dernière balise fermante </script>.
    on peut réussir à sélectionner uniquement la dernière section de script avec l'expression suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <Script(?!.*<Script).*</Script>
    la partie entre parenthèse signifie "si on ne trouve pas un nombre quelconque de caractères quelconques suivi de la chaine <Script après". plus d'info sur la page de doc
    en gros, avec cette notation, la balise ouvrante ne sera psa reconnue si un autre balise ouvrante existe plus tard dans le texte.
    tu es donc en mesure d'effacer la dernière section de script. et si tu boucles, tu dois pouvoir effacer toutes les balise de script...



    maintenant, y a d'autre façons de faire:
    • tu peux éventuellement chercher les endroits apparaissent toutes les balises ouvrante, puis chercher toutes le balises fermantes, puis effacer tout ce qu'il y a entre la première balise ouvrante et la première balise fermante, puis tout ce qu'il y a entre la 2e balise ouvrante et la 2e balise fermante, etc...
    • peut être plus pratique: le HTML est un sous ensemble du XML, tu dois probablement pouvoir virer simplement les balises <script> en passant par une bibliothèque de manipulation XML
    • y a peut être même des bibliothèques spécialisés dans la manipulation du HTML
    • y a peut être moyen de faire ce que tu veux en une seule expression régulière et sans faire de boucle, mais elle risque de pas être évidente à mettre au point

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Février 2012
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 48
    Points : 105
    Points
    105
    Par défaut
    Tu as la bibliothèque lxml avec html.clean_html.
    Ça va te dégager les balises script avec leur contenu, en te laissant le reste.
    Toujours avec lxml.html, tu as la possibilité de "nettoyer" le html (balise non fermée, etc...) et de récupérer uniquement le texte avec

    Un exemple (avec la page google, parce qu'elle est un bon exemple de truc chiant à parser, avec une tonne de trucs parasite dont on veut se débarrasser):
    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
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    from __future__ import unicode_literals, print_function, division
    import re
     
    import requests
    from lxml import html
    from lxml.html.clean import Cleaner
     
    # On récupère les données en utilisant une bibliothèque un poil plus sympa que urllib
    r = requests.get('http://www.google.fr/')
    data = r.content.decode(r.encoding)
     
    # On définit un nettoyeur de html. Il y a une fonction toute faite dans lxml, mais elle ne nettoie pas le css.
    # On veut quand même s'en débarrasser, donc on précise ici.
    cleaner = Cleaner(style=True)
    data = cleaner.clean_html(data)
     
    # On récupère uniquement le contenu textuel via method="text"
    data = html.fromstring(data)
    data = html.tostring(data, method="text", encoding="utf-8").decode('utf-8')
     
    # On dégage les espaces blancs inutile
    print(re.sub('\s+', ' ', data))
    Le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Google Recherche Images Maps Play YouTube Actualités Gmail Drive Plus »Historique Web | Paramètres | Connexion France*Recherche avancéeOutils linguistiquesSolutions publicitairesSolutions d'entreprise+GoogleÀ propos de GoogleGoogle.com© 2013 - Confidentialité et conditions d'utilisation

  4. #4
    Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    221
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 221
    Points : 61
    Points
    61
    Par défaut
    merci beaucoup ta solution est superbe

  5. #5
    Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    221
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 221
    Points : 61
    Points
    61
    Par défaut
    bonsoir
    maintenant j'aimerai récupéré les liens contenu dans une page web juste lien par exemple j'ai une page
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <p>You can get a lot more fun out of watching a rugby game if you know some of the lingo. And of course, if you want to watch a live game you have to know where the pitch is! This brief guide is not exhaustive of all the terms and rules of the sport. The referenced websites below will have a lot more information for you to investigate so you can begin your foray into rugby speak.</p>
    <p>References:</p>
    <p><a href="http://guide.rugbyrugby.com/Rugby%20Sections/Beginners%20Guide/Rugby%20Lingo.asp">http://guide.rugbyrugby.com/Rugby%20Sections/Beginners%20Guide/Rugby%20Lingo.asp</a></p>
    j'aimerai récupéré le lien dans la balise <a> qui est http://guide.rugbyrugby.com/Rugby%20...by%20Lingo.asp
    merci

  6. #6
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 823
    Points : 7 119
    Points
    7 119
    Par défaut
    Si tu as choisi la solution lxml

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> import lxml.html
    >>> htm = """<p><a href="http://guide.rugbyrugby.com/Rugby%20Sections/Beginners%20Guide/Rugby%20Lingo.asp">http://guide.rugbyrugby.com/Rugby%20Sections/Beginners%20Guide/Rugby%20Lingo.asp</a></p>"""
    >>> tree = lxml.html.fromstring(htm)
    >>> print(tree.xpath('//a/@href'))
    ['http://guide.rugbyrugby.com/Rugby%20Sections/Beginners%20Guide/Rugby%20Lingo.asp']
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

Discussions similaires

  1. [VB.NET]comment q'une page charge des parametres
    Par arize dans le forum ASP.NET
    Réponses: 2
    Dernier message: 22/11/2006, 12h46
  2. comment actualiser une page web automatiquement ?
    Par safadev dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 20/09/2006, 23h34
  3. Réponses: 8
    Dernier message: 21/08/2006, 15h38
  4. Comment fermer une page web automatiquement
    Par dessinateurttuyen dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 10/08/2006, 10h20
  5. Comment affciher une page web dans ma feuille MDI
    Par callo dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 29/01/2005, 17h23

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