【问题标题】:Extracting values from js source or HTML tags with R?使用R从js源或HTML标签中提取值?
【发布时间】:2019-07-22 05:36:26
【问题描述】:

我正在尝试使用webpage 为我的 SQL 数据库创建一个管道,以包含所有在 NBA 打过球的球员以及他们对应的唯一球员 ID(如下图所示)。

ID 是如何表现自己的

我能够在 python 中成功执行此操作(改为创建 CSV),同时手动创建一个列表,其中包含我在检查页面后在网络响应中找到的 stats_ptsd.js 文件中的变量。我没有显示这个 python 代码,因为它不是在抓取页面,而是引用这个手动复制的列表。

网络响应

CSV 的外观

现在我不知道如何使用 R 来抓取信息。我尝试了很多我在互联网上看到的不同方法,其中许多使用了 rvest 包,但无济于事。我目前没有任何有意义的输出或错误消息要显示。希望有人对最好的方法提出建议,无论是通过访问 .js 文件还是抓取 HTML 元素。具有有效href 的播放器'a' HTML 元素的xpath 如下所示。

//*[contains(concat( " ", @class, " " ), concat( " ", "players-list__name", " " )) and (((count(preceding-sibling::*) + 1) = 91) and parent::*)]//a

【问题讨论】:

    标签: javascript html r web-scraping


    【解决方案1】:

    数据来自您可以在网络选项卡中找到的 js 文件。您可以对其中的 javascript 字典进行正则表达式或子串化,并使用 json 解析器进行解析。

    library(rvest)
    library(stringr)
    library(magrittr)
    library(jsonlite)
    
    r <- read_html('https://stats.nba.com/js/data/ptsd/stats_ptsd.js') %>%
      html_node('body') %>%
      html_text() %>%
      toString()
    data <- str_match_all(r,'stats_ptsd = (.*);')
    data <- data.frame(jsonlite::fromJSON(data[[1]][,2])$data$players)
    write.csv(data,file="players.csv")
    

    您也可以在写出之前进行子集化和重新排序:

    df <- setNames(data[,c("X2","X1")],c("Name","Id"))
    write.csv(df,file="players.csv")
    

    参考资料:

    1. https://github.com/yusuzech/r-web-scraping-cheat-sheet/blob/master/README.md#rvest6.1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-05
      • 1970-01-01
      • 1970-01-01
      • 2019-04-04
      • 1970-01-01
      • 1970-01-01
      • 2020-12-22
      • 1970-01-01
      相关资源
      最近更新 更多