代码之家  ›  专栏  ›  技术社区  ›  Laura

使用R从Web上抓取列

  •  1
  • Laura  · 技术社区  · 5 年前

    我有这个网站,我想提取前4列。但它不起作用。我是网络垃圾的乞丐,任何帮助都是了不起的家伙:

    https://projects.fivethirtyeight.com/2017-nba-predictions/
    

    我想提取每一列: ELO -- CARM-ELO 等等

    这就是我到目前为止所做的:

    url_nba <- 'https://projects.fivethirtyeight.com/2017-nba-predictions/'
    
    webpage_nba <- read_html(url_nba)
    
    data_nba.1 <- html_nodes(webpage_nba,'.num elo original desktop')
    data_nba.2 <- html_nodes(webpage_nba,'.num elo carmelo')
    

    在这之后,我想加入一个数据框。

    有什么帮助吗?

    0 回复  |  直到 5 年前
        1
  •  1
  •   QHarr    5 年前

    当你得到等长的节点列表时,你可以使用css选择器来选择你想要的列,然后cbind转换成dataframe作为替代。下面的选择器将导出一个干净的输出数据帧。

    library(rvest)
    library(magrittr)
    
    page <- read_html('https://projects.fivethirtyeight.com/2017-nba-predictions/')
    df <- setNames(data.frame(cbind(
      html_text(html_nodes(page, 'td.original')),
      html_text(html_nodes(page, 'td.carmelo')),
      html_text(html_nodes(page, '.change')),
      html_text(html_nodes(page, '.team a'))
    )),c('elo','carmelo','1wkchange','team'))
    
    print(df)
    
        2
  •  1
  •   Dave2e    5 年前

    从HTML代码来看,表格的形状有点错误。一种方法是抓取整个表格,然后收集Elo分数。

    在寻找css标签“table”时,发现了三个表。手动查看每一个,表3是一个有趣的。

    library(rvest)
    url_nba <- 'https://projects.fivethirtyeight.com/2017-nba-predictions/'
    webpage_nba <- read_html(url_nba)
    
    #collect the tables from the page
    tables <- html_nodes(webpage_nba,'table')
    
    #Process the table of interest (returns a list of 1)
    resultdf <- tables[3] %>% html_table(fill=TRUE)
    resultdf <- resultdf[[1]]
    

    变量“resultdf”是感兴趣表格的数据帧。由于存在一些隐藏字段和其他非标准信息,因此需要清理一些第一行,重新命名列并移除空白列。