2017-12-29 16 views
1

Ich versuche, einige Tennis-Statistiken mit r von mehreren Links mit rvest und selectorgadget zu kratzen. Seite Ich schabe aus ist http://www.atpworldtour.com/en/scores/archive/stockholm/429/2017/results und es gibt 29 Links, die wie folgt aussehen: "http://www.atpworldtour.com/en/scores/2017/429/MS001/match-stats". Alle Links sehen gleich aus, aber ändern sich von MS001-MS029. Mit dem untenstehenden Code bekomme ich das gewünschte Ergebnis mit nur den ersten 9 Links. Ich sehe das Problem, weiß aber nicht, wie ich es korrigieren kann. Die ersten 9 Links haben Double 00 und der Rest hat Single 0. Der 10. Link sollte MS010 sein. Jede Hilfe mit dieser sehr geschätzt.Web scrape mehrere Links mit r

library(xml) 
library(rvest) 
library(stringr) 

round <- 1:29 
urls <- paste0("http://www.atpworldtour.com/en/scores/2017/429/MS00", round, 
"/match-stats") 

aces <- function(url) { 
url %>% 
read_html() %>% 
html_nodes(".percent-on:nth-child(3) .match-stats-number-left span") %>% 
html_text() %>% 
as.numeric() 
} 

results <- sapply(urls, aces) 
results 
$`http://www.atpworldtour.com/en/scores/2017/429/MS001/match-stats` 
[1] 9 

$`http://www.atpworldtour.com/en/scores/2017/429/MS002/match-stats` 
[1] 8 

$`http://www.atpworldtour.com/en/scores/2017/429/MS003/match-stats` 
[1] 5 

$`http://www.atpworldtour.com/en/scores/2017/429/MS004/match-stats` 
[1] 4 

$`http://www.atpworldtour.com/en/scores/2017/429/MS005/match-stats` 
[1] 8 

$`http://www.atpworldtour.com/en/scores/2017/429/MS006/match-stats` 
[1] 9 

$`http://www.atpworldtour.com/en/scores/2017/429/MS007/match-stats` 
[1] 2 

$`http://www.atpworldtour.com/en/scores/2017/429/MS008/match-stats` 
[1] 9 

$`http://www.atpworldtour.com/en/scores/2017/429/MS009/match-stats` 
[1] 5 

$`http://www.atpworldtour.com/en/scores/2017/429/MS0010/match-stats` 
numeric(0) 

Antwort

1

Man kann über die Funktion sprintf() führenden Nullen in einer Zeichenkette formatiert erzeugen.

ids <- 1:29 
urlList <- sapply(ids,function(x){  
sprintf("%s%03d%s","http://www.atpworldtour.com/en/scores/2017/429/MS", 
     x,"/match-stats") 
}) 
# print a few items 
urlList[c(1,9,10,29)] 

... und die Ausgabe:

> urlList[c(1,9,10,29)] 
[1] "http://www.atpworldtour.com/en/scores/2017/429/MS001/match-stats" 
[2] "http://www.atpworldtour.com/en/scores/2017/429/MS009/match-stats" 
[3] "http://www.atpworldtour.com/en/scores/2017/429/MS010/match-stats" 
[4] "http://www.atpworldtour.com/en/scores/2017/429/MS029/match-stats" 
> 
+0

Das funktioniert gut, danke. Tatsächlich existieren 3 Links MS016, MS020 und MS027 nicht. Darf ich nachfragen und fragen, ob es einen Weg gibt, nur die Verbindungen zwischen 1:29 zu kratzen? – mrsama

+0

sicher, verwenden Sie IDs <- c (1: 15,17: 19,21: 26,28: 29), um die URLs zu generieren. –

+0

@mrsama - Wenn Sie die von mir zur Verfügung gestellte Lösung verwenden konnten, akzeptieren Sie bitte meine Antwort. –