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