在R中刮刮basketball-reference.com(XML包没有完全工作)

时间:2015-01-08 02:21:45

标签: xml r screen-scraping

我已经在R中使用“readHTMLtable”在没有任何问题的情况下使用XML包抓取各种篮球参考页面一段时间了,但现在我有一个。当我试图刮擦玩家页面的分割部分时,它只返回表格的第一行而不是全部。

例如:

URL="http://www.basketball-reference.com/players/j/jamesle01/splits/"
tablefromURL = readHTMLTable(URL)
table = tablefromURL[[1]]

这给了我表中只有一行,第一行。但我想要所有的行。我认为问题是表中有多个标题,但我不确定如何解决这个问题。

由于

3 个答案:

答案 0 :(得分:2)

为什么不试试rvest库。您可以使用

完成此操作
library(rvest)
dd <- html_session("http://www.basketball-reference.com/players/j/jamesle01/splits/") %>%
    html_node("table#stats") %>%
    html_table()

数据中混合的标题仍然有点混乱,但确实提取整个表格。

使用

进行测试
R version 3.1.0 (2014-04-10)
Platform: x86_64-apple-darwin10.8.0 (64-bit)

other attached packages:
[1] rvest_0.2.0

loaded via a namespace (and not attached):
[1] httr_0.6.1    magrittr_1.5  stringr_0.6.2

答案 1 :(得分:2)

您可以对表格主体进行过滤:

library(XML)
appURL <- "http://www.basketball-reference.com/players/j/jamesle01/splits/"
doc <- htmlParse(appURL)
appTables <- doc['//table/tbody']

appTables将是一个包含12个表无标题的列表。要检索标题,您可以从thead

获取标题
myHeaders <- unlist(doc["//thead/tr[2]/th", fun = xmlValue])
myTables <- lapply(appTables, readHTMLTable, header = myHeaders)

您可以使用以下内容将数据放在一个大表中:

bigTable <- do.call(rbind, myTables)
> head(bigTable)
Split Value   G  GS    MP   FG   FGA   3P  3PA   FT  FTA  ORB  TRB  AST  STL BLK  TOV   PF   PTS  FG%  3P%  FT%
1          Total 871 870 34364 8582 17289 1184 3462 5553 7432 1049 6239 6011 1483 698 2906 1615 23901 .496 .342 .747
2    Place  Home 441 440 17167 4201  8307  567 1627 2805 3706  507 3133 3082  711 387 1413  744 11774 .506 .348 .757
3           Road 430 430 17197 4381  8982  617 1835 2748 3726  542 3106 2929  772 311 1493  871 12127 .488 .336 .738
4 All-Star   Pre 569 568 22349 5544 11167  759 2205 3576 4791  655 4051 3966  967 456 1940 1087 15423 .496 .344 .746
5           Post 302 302 12015 3038  6122  425 1257 1977 2641  394 2188 2045  516 242  966  528  8478 .496 .338 .749
6   Result   Win 572 571 22196 5783 11094  772 2154 3749 4931  677 4241 4132 1032 496 1793 1016 16087 .521 .358 .760
TS% USG% ORtg DRtg   MP  PTS TRB AST
1 .581 31.9  116  103 39.5 27.4 7.2 6.9
2 .592 30.9  118  102 38.9 26.7 7.1 7.0
3 .571 32.8  114  105 40.0 28.2 7.2 6.8
4 .581 31.7  116  103 39.3 27.1 7.1 7.0
5 .582 32.2  117  104 39.8 28.1 7.2 6.8
6 .606 31.7  122   99 38.8 28.1 7.4 7.2

答案 2 :(得分:0)

查看htmltab包(https://github.com/crubba/htmltab)。我为更复杂的HTML表开发了这个包,其中readHTMLTable()几乎没用。

devtools::install_github("crubba/htmltab")
library(htmltab)
htmltab(doc = "http://www.basketball-reference.com/players/j/jamesle01/splits/", header = 1:2)