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 :

Crawler avec Regex


Sujet :

Python

  1. #1
    Membre régulier
    Homme Profil pro
    Webdesigner
    Inscrit en
    Avril 2005
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Webdesigner

    Informations forums :
    Inscription : Avril 2005
    Messages : 120
    Points : 93
    Points
    93
    Par défaut Crawler avec Regex
    Bonjour a tous,

    cela est un exercice de pratique avec python qui consiste à trouver des chaînes de caractéres spécifique (qui contient des caractéres spéciaux).
    j'ai utilisé plusieurs modules de python.

    dans ce 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
     
    import pickle
    import re
    import requests
    from bs4 import BeautifulSoup
     
    #pattern = r"(\+\d\s*\d(?:-?\d)+)([\w.-]+@[\w.-]+(?:\.[\w.-]+)*\.[a-z]{2,6})"
     
     
    def dow_web(url):
        URL = url
        page = requests.get(URL)
        spe = BeautifulSoup(page.content, 'html.parser')
        elems = spe.find_all('loc') # récuperer le contenu de la balise loc
        for nb in elems:
            tag = nb.text
            page = requests.get(tag)
            sp = BeautifulSoup(page.content, 'html.parser') #récupérer le contenur de HTML 
            reg = r"([\w.-]+@[\w.-]+(?:\.[\w.-]+)*\.[a-z]{2,6})" # regex pour récupérer les emails
            mat = re.findall(reg, sp)
            return mat
     
    dow_web("https://www.monsiteweb.com/sitemap.xml")

    mon regex si je lui passe une variable avec du string dedant il me trouve les emails.

    Mon erreur est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Traceback (most recent call last):
    File "C:/crawler.py", line 24, in dow_web  matches = re.findall(pattern, soup)
     
    File "C:\Users\AdataY\AppData\Local\Programs\Python\Python38\lib\re.py", line 241, in findall return _compile(pattern, flags).findall(string)
     
    TypeError: expected string or bytes-like object

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 355
    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 355
    Points : 36 883
    Points
    36 883
    Par défaut
    Salut,

    Appelez n'importe quelle fonction avec des paramètres, si elle plante en disant le paramètre passé n'est pas un des types attendus... difficile de ne pas regarder (avec print par exemple) à quoi il ressemble.

    Et çà on ne peut pas le faire à votre place.

    - W

  3. #3
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Je doute que la fonction ne fonctionne jamais:

    [1] Quand on fait print(sp), ça donne quelque chose bien comme sp sérialisé en un string. Mais c'est fait par une conversion interne avant d'imprimer. Quand on fait passer directement pour faire matcher par des expressions regulières, ça ne se fait pas. Le minimum c'est de faire une conversion par str() explicitement.

    [2] Quand on collecte les matchs, il ne faut pas faire un retour là: l'affaire n'est pas finie, là seul le premier page s'est faite; or, le reste ?

    [3] On utile répéter findall(), on est plutôt amené à faire une version avec reg compilé: mais bref, c'est ce qu'on doit faire après pour améliorer le code.

    Voici ce que je vois comment la faire marcher.
    Code python3, bs4 : 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
    def dow_web(url):
        URL = url
        page = requests.get(URL)
        spe = BeautifulSoup(page.content, 'html.parser')
        elems = spe.find_all('loc') # récuperer le contenu de la balise loc
     
        mat=[]
        reg = r"([\w.-]+@[\w.-]+(?:\.[\w.-]+)*\.[a-z]{2,6})" # regex pour récupérer les emails
     
        for nb in elems:
            tag = nb.text
            page = requests.get(tag)
            sp = BeautifulSoup(page.content, 'html.parser') #récupérer le contenur de HTML 
            mat.extend(re.findall(reg, str(sp)))
     
        return mat
     
    emaillist=dow_web("https://www.monsiteweb.com/sitemap.xml")
    #print(emaillist)

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

Discussions similaires

  1. Probleme avec REGEX sous IE
    Par Death83 dans le forum Général JavaScript
    Réponses: 17
    Dernier message: 18/07/2006, 20h02
  2. Problème avec Regex
    Par trihanhcie dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 13/07/2006, 14h50
  3. Réponses: 2
    Dernier message: 25/05/2006, 11h11
  4. [RegEx] analyseur de requette SQL avec RegEx - [casse tête]
    Par sebbod dans le forum Langage
    Réponses: 2
    Dernier message: 28/03/2006, 10h56
  5. Problème avec RegEx et une Query string
    Par Erakis dans le forum Langage
    Réponses: 6
    Dernier message: 08/11/2005, 15h48

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