微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

xml – 使用R刮取多个页面的HTML表

我试图通过从网上抓取来制作数据框.但是有很多页面组成了我试图抓住的表格.相同的链接,但页面是不同的.

对于第一页,我就是这样做的:

library(XML)
CB.13<- "http://www.nfl.com/stats/categorystats?tabSeq=1&season=2013&seasonType=REG&experience=&Submit=Go&archive=false&conference=null&d-447263-p=1&statisticPositionCategory=DEFENSIVE_BACK&qualified=true"
CB.13<- readHTMLTable(CB.13,header=FALSE)
cornerback.function<- function(CB.13){
  first<- "1"
  last<- "1"
  for (i in 1:length(CB.13)){
    lastrow<- nrow(CB.13[[i]])
    lastcol<- ncol(CB.13[[i]])
    if(as.numeric(CB.13[[i]] [1,1]) ==first & as.numeric(CB.13[[i]] [lastrow,lastcol]) ==last) {
      tab <- i
    }
  }
}
cornerback.function(CB.13)
cornerbacks.2013<- CB.13[[tab]]
cb.names<- c("Rk","name","Team","Pos","Comb","Total","Ast","Sck","SFTY","PDef","Int","TDs","Yds","Lng","FF","Rec","TD")
names(cornerbacks.2013)<- cb.names

我需要多年这样做,所有这些都有多个页面 – 所以有更快的方法获取数据的所有页面而不必为表格的每个页面执行此操作并合并它们吗?下一个链接http://www.nfl.com/stats/categorystats?tabSeq=1&season=2013&seasonType=REG&Submit=Go&experience=&archive=false&conference=null&d-447263-p=2&statisticPositionCategory=DEFENSIVE_BACK&qualified=true

今年有8页 – 也许是for循环遍历页面

解决方法

您可以使用paste0动态创建URL,因为它们略有不同.在某一年中,您只需更改页码.你得到一个网址结构,如:

url <- paste0(url1,year,url2,page,url3) ## you change page or year or both

您可以创建一个循环遍历不同页面函数,并返回一个表.然后你可以使用经典的do.call(rbind,..)绑定它们:

library(XML)
url1 <- "http://www.nfl.com/stats/categorystats?tabSeq=1&season="
year <- 2013
url2 <- "&seasonType=REG&experience=&Submit=Go&archive=false&conference=null&d-447263-p="
page <- 1
url3 <- "&statisticPositionCategory=DEFENSIVE_BACK&qualified=true"

getTable <- 
  function(page=1,year=2013){
    url <- paste0(url1,url3)
    tab = readHTMLTable(url,header=FALSE) ## see comment !!
    tab$result
}
## this will merge all tables in a single big table
do.call(rbind,lapply(seq_len(8),getTable,year=2013))

一般方法

一般方法是使用一些xpath标记废弃下一页url并循环直到没有任何新的下一页.这可能更难做,但它是最干净的解决方案.

getNext <- 
function(url=url_base){
  doc <- htmlParse(url)
  XPATH_NEXT = "//*[@class='linkNavigation floatRight']/*[contains(.,'next')]"
  next_page <- unique(xpathSApply(doc,XPATH_NEXT,xmlGetAttr,'href'))
  if(length(next_page)>0)
    paste0("http://www.nfl.com",next_page)
  else ''
}
## url_base is your first  url
res <- list()
while(TRUE){
  tab = readHTMLTable(url_base,header=FALSE)
  res <- rbind(res,tab$result)
  url_base <- getNext(url_base)
  if (nchar(url_base)==0)
    break
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。