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 Discussion :

Extraction de données web sous forme de table non homogène- Fonction grep ?


Sujet :

R

  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 16
    Points : 18
    Points
    18
    Par défaut Extraction de données web sous forme de table non homogène- Fonction grep ?
    Bonjour,

    Je vous contacte car je rencontre à nouveau un problème pour un travail d'extraction de petites annonces sur un site internet. Je cherche à extraire les données des petites annonces dont une partie se présente sous forme de table, le problème est que certaines table ont des informations différentes et mon programme ne fonctionne pas.

    Voila le script pour obtenir mes données :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    docu<-sprintf("http://www.leboncoin.fr/_maison_/offres/ile_de_france/?o=%s",1:8)
     
    links <- sapply(docu, function(x)
    { xpathSApply (htmlParse(x),
                   "//div[contains(@class,'list-lbc')]/a",
                   xmlGetAttr,name = "href")
    })
     
    listli<-as.vector(links)
     
    length(listli)
    Voila mon code pour extraire mes tables qui va me poser problème par la suite , car j'ai du suite à vos conseil utiliser la fonction grep pour filtrer les valeurs manquante lorsque certaines informations n'étaient pas renseignées:

    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
    v<-NA
    MyTable <- data.frame()
    for (i in 1:length(listli)) {
      v[i] <- readHTMLTable(listli[i], head=2)
      val <- as.character(v[[i]]$V2)
      # Transformation du prix commençant par un chiffre et se terminant par €
      prix <- grep('^[0-9].*[^a-zA-Z0-9]$', val, perl=T)
      if (length(prix)!=0) { MyTable[i,1] <- val[prix] } else  {MyTable[i,1] <- NA } 
      # Transformation d'une ville, c'est tout ce qui commence par des lettres et ne contenant pas de chiffres
      # on suppose que les noms des villes depassent au moins 4 carateres
      vil <- grep('^[a-zA-Z].{4,1000}$', val, perl=T)
      if (length(vil)!=0) { MyTable[i,2] <- val[vil] } else  {MyTable[i,2] <- NA } 
      # Transformation du code postal: c'est exactement 5 chiffre, sans le signe € et sans lettre alphabetiques
      cp <- grep('^[0-9]{5}$', val, perl=T) 
      if (length(cp)!=0) { MyTable[i,4] <- val[cp] } else  {MyTable[i,4] <- NA }  
    }
     
    names(MyTable) <- c("prix", "ville","Code Postal")
    Mon problème vient du fait que certaines annonces son sous la forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    Prix  : 10€
    Ville  : Melun
    Code Postal : 77170
    Et d'autres notamment les vêtements ajoutent des informations notamment le type et la taille :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Prix  : 10€
    Ville  : Melun
    Code Postal : 77170
    Type : Femme
    Taille : 38
    En fait je souhaiterais ne récupérer que les 3 1ères lignes de ces différents tableaux avec seulement le prix la ville et le code postal..Sachant que parfois, le prix ou le code postal ou la ville ne sont pas non plus renseigné..

    Quelqu'un aurait une idée de comment filtrer ces données ? Est ce que selon vous je suis obligée de récuperer quand même ces données en rajoutant des variables ? Mais je ne saurais pas comment différencier par exemple le type ( homme femme enfant ) de la ville, avec la fonction Grep..

    Je vous remercie par avance

  2. #2
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2013
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2013
    Messages : 75
    Points : 191
    Points
    191
    Par défaut
    La fonction 'xpathSApply' fait quoi ?

    De plus peut-être ne devrais tu pas utiliser la fonction 'nchar' plutôt que 'length' qui renvoie toujours '1' lorsque qu'on lui envoie une variable ?

    Enfin pour les expressions régulières voici un lien : http://ciam.inra.fr/r4ciam/node/148
    par exemple tu peux remplacer [0-9] par [[:digit:]], ce qui est plus lisible.

  3. #3
    Membre du Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Août 2011
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Août 2011
    Messages : 68
    Points : 45
    Points
    45
    Par défaut
    Salut Chacha !!

    Moi je serai toi je continuerai à utiliser la fonction xpathSApply avec un chemin xpath. Par contre, pense bien à enlever les "/tbody" de m**** dans les chemin xpath.
    Tu les mets chacun dans une liste, que tu concatène à la fin.

    Ça donne :

    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
    library(XML)
     
    A=NULL
    B=NULL
    C=NULL
     
    for(i in 1:length(listli)) {
    try(A[i]<-xpathSApply(htmlParse(listli[i]),"/html/body/div[2]/div/div/div[3]/div/div/div[3]/div[3]/table/tr/td/span",xmlValue,encoding="UTF-8"), silent=TRUE)
    try(B[i]<-xpathSApply(htmlParse(listli[i]),"/html/body/div[2]/div/div/div[3]/div/div/div[3]/div[3]/table/tr[2]/td",xmlValue,encoding="UTF-8"), silent=TRUE) 
    try(C[i]<-xpathSApply(htmlParse(listli[i]),"/html/body/div[2]/div/div/div[3]/div/div/div[3]/div[3]/table/tr[3]/td",xmlValue,encoding="UTF-8"), silent=TRUE)
     
    D=cbind(A,B,C) }
     
    ************Résultat**************
     
    D
           A         B                          C      
      [1,] "50*€"    "Sainte-Colombe"           "77650"
      [2,] "290*€"   "Etréchy"                  "91580"
      [3,] "9*€"     "Boulogne-Billancourt"     "92100"
      [4,] "3*€"     "Rambouillet"              "78120"
      [5,] "6*€"     "Neuilly-sur-Marne"        "93330"
      [6,] "20*€"    "Maurepas"                 "78310"
      [7,] "2*€"     "Gennevilliers"            "92230"
      [8,] "8*€"     "Elancourt"                "78990"
      [9,] "1*€"     "Rambouillet"              "78120"
    Un joli petit tableau à 3 colonnes.

    Ah oui ! et la fonction try( te permet de renvoyer une valeur "NA" si il ne trouve pas de données. Sympa non ?

    Allez la bise Lucette
    Je signe donc je suis

  4. #4
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 16
    Points : 18
    Points
    18
    Par défaut
    Merci beaucoup ! Avec XpathApply et la fonction try ça fonctionne parfaitement !

    Bonne journée !

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

Discussions similaires

  1. Table de données Access sous forme de "buffer tournant"
    Par melleb dans le forum Accès aux données
    Réponses: 6
    Dernier message: 21/09/2012, 10h11
  2. présenter des données sous forme de table
    Par autousto dans le forum Simulink
    Réponses: 0
    Dernier message: 10/08/2011, 10h19
  3. [MySQL] probleme afficher donnée BDD sous forme de tableau
    Par body72 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 17/03/2008, 21h27
  4. Importer base données (web) sous Excel ou Access
    Par altarez dans le forum Général VBA
    Réponses: 5
    Dernier message: 20/08/2007, 11h18
  5. résultat de requêtte sql sous form de table
    Par developpeur_mehdi dans le forum Bases de données
    Réponses: 5
    Dernier message: 08/03/2004, 15h19

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