readHTMLTable折叠span元素

时间:2014-12-01 18:40:10

标签: html xml r

我正在尝试从此site获取游戏数据并使用XML包执行此操作:

library(XML)
url <- 'http://scores.nbcsports.msnbc.com/cbk/teamstats.asp?team=1115&report=schedule'
raw.schedule <- readHTMLTable(url, which=2)

问题是HTML日期列中的所有<span>元素都在折叠在一起。

R> raw.schedule$Date[1]
[1] "11/142:30 PM PT3:30 PM MT4:30 PM CT5:30 PM ET10:30 PM GMT6:30 PM 北京时间3:30 PM MST5:30 PM EST"

理想情况下,我希望只有日期元素,例如:

R> raw.schedule$Date[1]
    [1] "11/14"

我尝试了rvest包,但我遇到了同样的问题。是否可以读取此表并保持<span>元素分开,或者只选择第一个元素?

1 个答案:

答案 0 :(得分:2)

定义一个自定义函数来解析表格的单元格:

myFun <- function(x){
  if(length(y <- getNodeSet(x, "./span[@class=\"shsGameDate\"]")) > 0){
    # date column
     return(xmlValue(y[[1]]))
  }
  if(length(y <- getNodeSet(x, "./span[@class=\"shsTimezone shsETZone\"]")) > 0){
    # time column
    return(xmlValue(y[[1]]))
  }
  xmlValue(x, encoding = "UTF-8")
}

现在可以使用自定义函数调用readHTMLTable函数来解析单元格:

library(XML)
url <- 'http://scores.nbcsports.msnbc.com/cbk/teamstats.asp?team=1115&report=schedule'
raw.schedule <- readHTMLTable(url, which=2, elFun = myFun)

> head(raw.schedule)
   Date      Opponent       Time TV     Result
1 11/14     vs.  Yale 5:30 PM ET    W  88 - 85
2 11/18 vs.  La Salle 8:00 PM ET    L  58 - 60
3 11/22    at  Albany 7:00 PM ET    W  76 - 73
4 11/25 vs.  Hartford 7:00 PM ET    L  50 - 54
5 11/30  vs.  Vermont 1:00 PM ET    W  89 - 73
6  12/5     at  Siena 7:00 PM ET       Tickets