Xml 使用R使用多页刮取HTML表
我正试图通过从网上抓取来制作一个数据框。但是,我正在努力拼凑的表格中有多个页面。相同的链接,但页面不同 对于第一页,我将这样刮它:Xml 使用R使用多页刮取HTML表,xml,r,web-scraping,Xml,R,Web Scraping,我正试图通过从网上抓取来制作一个数据框。但是,我正在努力拼凑的表格中有多个页面。相同的链接,但页面不同 对于第一页,我将这样刮它: library(XML) CB.13<- "http://www.nfl.com/stats/categorystats?tabSeq=1&season=2013&seasonType=REG&experience=&Submit=Go&archive=false&conference=null&d-44
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
库(XML)
CB.13您可以使用paste0
动态创建url,因为它们略有不同。在某一年中,您只需更改页码。您会得到如下url结构:
url <- paste0(url1,year,url2,page,url3) ## you change page or year or both
一般方法
一般的方法是使用一些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
}
getNext好的,我做了……您对此有什么建议吗您可能想将header=FALSE
添加到readHTMLTable
。由于某种原因,如果没有返回第一行,则无法返回第一行。信息是。非常好,否则(+1)。@RichardScriven我编辑我的答案,添加您的评论和另一个更通用的刮擦解决方案。
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
}