2013-02-01 9 views
4

J'essaie de rayer la liste des magasins du département pour le continent/pays de global Dept stores. Je cours le code suivant pour obtenir les continents d'abord, car nous pouvons voir que la hiérarchie de XML est telle que les pays avec chaque continent ne sont pas des noeuds d'enfant de ce continent.Grattage des données hiérarchiques

> url<-"http://en.wikipedia.org/wiki/List_of_department_stores_by_country" 
> doc = htmlTreeParse(url, useInternalNodes = T) 
> nodeNames = getNodeSet(doc, "//h2/span[@class='mw-headline']") 
> # For Africa 
> xmlChildren(nodeNames[[1]]) 
$a 
<a href="/wiki/Africa" title="Africa">Africa</a> 

attr(,"class") 
[1] "XMLInternalNodeList" "XMLNodeList"   
> xmlSize(nodeNames[[1]]) 
[1] 1 

Je sais que je pouvais faire les pays d'une commande séparée getNodeSet mais je voulais juste vous assurer que je ne suis pas manque quelque chose. Existe-t-il un moyen plus intelligent d'obtenir toutes les données sur chaque continent, puis dans chaque pays en même temps?

+0

Compte tenu de la structure de votre document, il peut être plus facile à analyser avec SAX plutôt que d'utiliser l'arbre DOM. – juba

Répondre

1

uisng xpath, plusieurs chemins peuvent être combinés avec | séparateur. Donc, je l'utilise pour obtenir des contries et des magasins dans la même liste. Ensuite, je reçois une deuxième liste de contries. J'utilise la dernière liste de diviser le premier

url<-"http://en.wikipedia.org/wiki/List_of_department_stores_by_country" 
library(XML) 
xmltext <- htmlTreeParse(url, useInternalNodes = T) 

## Here I use the combined xpath 
cont.shops <- xpathApply(xmltext, '//*[@id="mw-content-text"]/ul/li| 
            //*[@id="mw-content-text"]/h3',xmlValue) 
cont.shops<- do.call(rbind,cont.shops)     ## from list to vector 


head(cont.shops)     ## first element is country followed by shops 
    [,1]     
[1,] "[edit] Â Tunisia"  
[2,] "Magasin Général" 
[3,] "Mercure Market"  
[4,] "Promogro"    
[5,] "Geant"     
[6,] "Carrefour"    
## I get all the contries in one list 
contries <- xpathApply(xmltext, '//*[@id="mw-content-text"]/h3',xmlValue) 
contries <- do.call(rbind,contries)      ## from list to vector 

    head(contries) 
    [,1]     
[1,] "[edit] Â Tunisia"  
[2,] "[edit] Â Morocco"  
[3,] "[edit] Â Ghana"  
[4,] "[edit] Â Kenya"  
[5,] "[edit] Â Nigeria"  
[6,] "[edit] Â South Africa" 

Maintenant, je fais un peu le traitement de diviser les pays en utilisant cont.shops.

dd <- which(cont.shops %in% contries)     ## get the index of contries 
freq <- c(diff(dd),length(cont.shops)-tail(dd,1)+1)  ## use diff to get Frequencies 
contries.f <- rep(contries,freq)      ## create the factor splitter 


ll <- split(cont.shops,contries.f) 

Je peux vérifier le résultat:

> ll[[contries[1]]] 
[1] "[edit]  Tunisia"  "Magasin Général" "Mercure Market"  "Promogro"    "Geant"     
[6] "Carrefour"    "Monoprix"    
> ll[[contries[2]]] 
[1] "[edit] Â Morocco"               
[2] "Alpha 55, one 6-story store in Casablanca"         
[3] "Galeries Lafayette, to open in 2011[1] within Morocco Mall, in Casablanca" 
+0

C'était très utile. Je vous remercie – user1848018

Questions connexes