如何使用rvest()

时间:2016-08-30 16:23:07

标签: r web-scraping rvest

我想使用rvest包从Pro Football Reference网站获取一些数据。首先,让我们从这个网址http://www.pro-football-reference.com/years/2015/games.htm

中获取2015年所有游戏的结果
library("rvest")
library("dplyr")

#grab table info
url <- "http://www.pro-football-reference.com/years/2015/games.htm"
urlHtml <- url %>% read_html() 
dat <- urlHtml %>% html_table(header=TRUE) %>% .[[1]] %>% as_data_frame()

你是怎么做到的? :)

dat可以清理一下。两个变量似乎都有名字的空白。此外,标题行在每周之间重复。

colnames(dat) <- c("week", "day", "date", "winner", "at", "loser", 
                   "box", "ptsW", "ptsL", "ydsW", "toW", "ydsL", "toL")

dat2 <- dat %>% filter(!(box == ""))
head(dat2)

看起来不错!

现在让我们来看一下个人游戏吧。在上面的网页上,点击&#34; Boxscore&#34;在桌子的第一排:9月10日在新英格兰和匹兹堡之间进行的比赛。这需要我们:http://www.pro-football-reference.com/boxscores/201509100nwe.htm

我想抓住每个玩家的个人快照计数(大约在页面的一半)。很确定这些是我们的前两行代码:

gameUrl <- "http://www.pro-football-reference.com/boxscores/201509100nwe.htm"
gameHtml <- gameUrl %>% read_html()

但现在我无法弄清楚如何抓住我想要的特定桌子。我使用选择器小工具突出显示爱国者快照计数表。我是通过在几个地方点击表格来实现这一点的,然后“点击”&#39;突出显示的其他表格。我最终得到了一条道路:

#home_snap_counts .right , #home_snap_counts .left, #home_snap_counts .left, #home_snap_counts .tooltip, #home_snap_counts .left

这些尝试中的每一次都会返回{xml_nodeset (0)}

gameHtml %>% html_nodes("#home_snap_counts .right , #home_snap_counts .left, #home_snap_counts .left, #home_snap_counts .tooltip, #home_snap_counts .left")
gameHtml %>% html_nodes("#home_snap_counts .right , #home_snap_counts .left")
gameHtml %>% html_nodes("#home_snap_counts .right")
gameHtml %>% html_nodes("#home_snap_counts")

也许让我们尝试使用xpath。所有这些尝试也会返回{xml_nodeset (0)}

gameHtml %>% html_nodes(xpath = '//*[(@id = "home_snap_counts")]//*[contains(concat( " ", @class, " " ), concat( " ", "right", " " ))] | //*[(@id = "home_snap_counts")]//*[contains(concat( " ", @class, " " ), concat( " ", "left", " " ))]//*[(@id = "home_snap_counts")]//*[contains(concat( " ", @class, " " ), concat( " ", "left", " " ))]//*[(@id = "home_snap_counts")]//*[contains(concat( " ", @class, " " ), concat( " ", "tooltip", " " ))]//*[(@id = "home_snap_counts")]//*[contains(concat( " ", @class, " " ), concat( " ", "left", " " ))]')
gameHtml %>% html_nodes(xpath = '//*[(@id = "home_snap_counts")]//*[contains(concat( " ", @class, " " ))]')
gameHtml %>% html_nodes(xpath = '//*[(@id = "home_snap_counts")]')

我怎样才抓住那张桌子?我还会指出,当我这样做的时候,我会看到Page 34来源&#34;在谷歌浏览器中,我想要的表几乎似乎被注释掉了?也就是说,它们以绿色键入,而不是通常的红/黑/蓝配色方案。我们首先提取的游戏结果表并非如此。 &#34;查看页面来源&#34;该表是通常的红色/黑色/蓝色配色方案。绿色是否表明我无法抓住这个快照计数表?

谢谢!

1 个答案:

答案 0 :(得分:1)

您要查找的信息是在运行时以编程方式显示的。一种解决方案是使用RSelenium 在查看网页的来源时,表中的信息存储在代码中,但是由于表存储为注释而被隐藏。这是我的解决方案,我删除注释标记并正常重新处理页面。

我将文件保存到工作目录,然后使用readLines函数读取文件。现在我搜索html开始和结束注释标志,然后删除它们。我再次保存文件(减去注释标记),以重新读取和处理所选表的文件。

gameUrl <- "http://www.pro-football-reference.com/boxscores/201509100nwe.htm"
gameHtml <- gameUrl %>% read_html()
gameHtml %>% html_nodes("tbody")

#Only save and work with the body
body<-html_node(gameHtml,"body")
write_xml(body, "nfl.xml")

#Find and remove comments
lines<-readLines("nfl.xml")
lines<-lines[-grep("<!--", lines)]
lines<-lines[-grep("-->", lines)]
writeLines(lines, "nfl2.xml")

#Read the file back in and process normally
body<-read_html("nfl2.xml")
html_table(html_nodes(body, "table")[29])

#extract the attributes and find the attribute of interest
a<-html_attrs(html_nodes(body, "table"))

#find the tables of interest.
homesnap<-which(sapply(a, function(x){x[2]})=="home_snap_counts")
html_table(html_nodes(body, "table")[homesnap])

visitsnap<-which(sapply(a, function(x){x[2]})=="vis_snap_counts")
html_table(html_nodes(body, "table")[visitsnap])