彼得表示,您可以使用Selenium做到这一点。我还喜欢使用出色的选择器程序包。
其想法是与网站进行短暂交互,然后在其他地方进行其余操作。squawkData应该包含所需的一切。
# RSelenium::startServer() # if neededrequire(RSelenium)remDr <- remoteDriver()remDr$open()remDr$setImplicitWaitTimeout(3000)remDr$navigate("http://epl.squawka.com/stoke-city-vs-arsenal/01-03-2014/english-barclays-premier-league/matches")squawkData <- remDr$executescript("return new XMLSerializer().serializeToString(squawkaDp.xml);", list())require(selectr)example <- querySelectorAll(xmlParse(squawkData[[1]]), "crosses time_slice")example[[1]]<time_slice name="0 - 5" id="1"> <event player_id="531" mins="4" secs="39" minsec="279" team="44" type="Failed"> <start>73.1,87.1</start> <end>97.9,49.1</end> </event></time_slice>免责声明我是RSelenium软件包的作者。可以在RSelenium基础知识和
RSelenium:Testing
Shiny应用程序中查看有关操作的基本信息。
使用选择器可以轻松访问更多信息:
> xmlValue(querySelectorAll(xmlParse(squawkData[[1]]), "players #531 name")[[1]])[1] "Charlie Adam"> xmlValue(querySelectorAll(xmlParse(squawkData[[1]]), "game team#44 long_name")[[1]])[1] "Stoke City"
更新:
要将示例处理为数据框,您可以执行以下操作
out <- lapply(example, function(x){# handle each event if(length(x['event']) > 0){ res <- lapply(x['event'], function(y){ matchAttrs <- as.list(xmlAttrs(y)) matchAttrs$start <- xmlValue(y['start']$start) matchAttrs$end <- xmlValue(y['end']$end) matchAttrs }) return(do.call(rbind.data.frame, res)) }})> head(do.call(rbind, out)) player_id mins secs minsec team type start endevent 531 4 39 279 44 Failed 73.1,87.1 97.9,49.1event5 311 6 33 393 31 Failed 92.3,13.1 93.0,31.0event1 376 8 57 537 31 Failed 97.7,6.1 96.7,16.4event6 311 13 50 830 31 Failed 99.5,0.5 94.9,42.6event11 311 14 11 851 31 Failed 99.5,0.5 93.1,51.0event7 311 17 41 1061 31 Failed 99.5,99.5 92.6,50.1


