【问题标题】:Scraping basketball-reference.com in R (XML package not fully working)在 R 中抓取篮球参考.com(XML 包不能完全工作)
【发布时间】:2015-01-08 02:21:45
【问题描述】:

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

例如:

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

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

谢谢

【问题讨论】:

标签: xml r screen-scraping


【解决方案1】:

为什么不试试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

【讨论】:

  • 我收到此错误... FUN 中的错误(X[[1L]], ...):未使用的参数(trim = TRUE)
  • 对我来说效果很好:str(dd) 'data.frame': 82 obs. of 30 variables:。仍然需要将第一行提取为列名并将其余的转换为数字。
  • @hchw 您使用的是哪个版本的rvest?您是否准确复制/粘贴代码?
  • @BondedDust 我实际上已经尝试了一段时间。您知道使用 rvest 或 XML 可以轻松过滤掉节点吗?我想删除多余的&lt;theads&gt;
  • @MrFlick 我完全复制并粘贴了代码。我下载了rvest_0.2.0.tar.gz,然后作为源文件加载了
【解决方案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

【讨论】:

    【解决方案3】:

    查看 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)
    

    【讨论】:

      猜你喜欢
      • 2018-07-24
      • 2021-04-18
      • 1970-01-01
      • 2021-12-25
      • 1970-01-01
      • 1970-01-01
      • 2013-09-10
      • 2022-08-17
      • 1970-01-01
      相关资源
      最近更新 更多