【问题标题】:How to get table using rvest()如何使用 rvest() 获取表格
【发布时间】:2017-01-07 00:57:27
【问题描述】:

我想使用 rvest 包从 Pro Football Reference 网站获取一些数据。首先,让我们从这个 url 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)

看起来不错!

现在让我们看一个单独的游戏。在上面的网页上,点击表格第一行中的“Boxscore”: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()

但现在我不知道如何获取我想要的特定表。我使用 Selector Gadget 突出显示 Patriots 快照计数表。我通过单击几个位置的表格,然后“取消单击”突出显示的其他表格来做到这一点。我最终得到了一条路径:

#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")]')

我怎样才能抓住那张桌子?我还要指出,当我在 Google Chrome 中执行“查看页面源代码”时,我想要的表格似乎几乎被注释掉了?也就是说,它们以绿色输入,而不是通常的红/黑/蓝配色方案。我们首先提取的游戏结果表并非如此。该表的“查看页面源代码”是通常的红/黑/蓝配色方案。绿色是否表明是什么阻止了我获取这张快照计数表?

谢谢!

【问题讨论】:

  • url &lt;- "http://www.pro-football-reference.com/boxscores/201509100nwe.htm#all_vis_snap_counts" snap.count &lt;- url %&gt;% read_html() %&gt;% html_nodes(xpath='//*[contains(concat( " ", @class, " " ), concat( " ", "table_container", " " ))]') 返回列表中的一个元素(即{xml_nodeset (1)}),但我似乎无法使用html_table(fill=TRUE)将其转换为表格
  • 'http://www.pro-football-reference.com/boxscores/201509100nwe.htm' %&gt;% read_html() %&gt;% html_nodes(xpath = '//comment()') %&gt;% html_text() %&gt;% paste(collapse = '') %&gt;% read_html() %&gt;% html_node('table#home_snap_counts') %&gt;% html_table() %&gt;% {setNames(.[-1, ], paste0(names(.), .[1, ]))} %&gt;% readr::type_convert()

标签: r web-scraping rvest


【解决方案1】:

您要查找的信息在运行时以编程方式显示。一种解决方案是使用 RSelenium。

查看网页源时,表中的信息存储在代码中,但由于表存储为 cmets,因此被隐藏。这是我删除 cmets 标记并正常重新处理页面的解决方案。

我将文件保存到工作目录,然后使用 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])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多