【问题标题】:rvest -- how to scrape a table in a tab?rvest - 如何在选项卡中抓取表格?
【发布时间】:2021-08-15 08:36:19
【问题描述】:

我正在尝试使用 rvest 在选项卡中抓取表格,但 html_elements() 似乎忽略了它。

library(tidyverse)
library(rvest)

URL.BNPF <- 'https://fundkis.com/en/funds/bnppf-privatesustainable-balanced/BE6294262298#navs'
html <- read_html(URL.BNPF)

test <- html %>% 
    html_elements('#navs') %>%
    html_elements('.row') 

代码在此之前一直有效,但我尝试提取表本身(在标题“历史净资产值(报价)”下)之后的任何内容都会返回一个空列表。我怀疑表格位于选项卡下的事实可能会影响我需要查找的classid

非常感谢。

【问题讨论】:

    标签: r web-scraping tidyverse rvest


    【解决方案1】:

    数据是从 API 调用中动态提取的。您可以从初始 url 中获取 key 并将其传递给 API 调用,然后以 json 格式取回数据。我更改了 API 调用的 pageSize 参数,使其足够大以获得所有可能的结果。

    library(rvest)
    library(stringr)
    library(jsonlite)
    
    r <- read_html('https://fundkis.com/en/funds/bnppf-privatesustainable-balanced/BE6294262298#navs') 
    
    share_id <- stringr::str_match(r %>% html_node('[name=ReactRiskPart]') %>% html_attr('props'), '"shareId": "(.*?)"')[,2]
    
    api_url <- sprintf('https://fundkis.com/api/fkdb/navs/%s?PageIndex=0&PageSize=2000', share_id)
    
    data<- jsonlite::read_json(api_url)
    

    作为数据框:

    library(rvest)
    library(stringr)
    library(jsonlite)
    library(tidyverse)
    library(purrr)
    
    r <- read_html("https://fundkis.com/en/funds/bnppf-privatesustainable-balanced/BE6294262298#navs")
    
    share_id <- stringr::str_match(r %>% html_node("[name=ReactRiskPart]") %>% html_attr("props"), '"shareId": "(.*?)"')[, 2]
    
    api_url <- sprintf("https://fundkis.com/api/fkdb/navs/%s?PageIndex=0&PageSize=2000", share_id)
    
    data <- jsonlite::read_json(api_url)
    
    df <- map_dfr(data, data.frame) %>%
      mutate(Date = format.Date(NavDate)) %>%
      select(-c("FundShareId", "NavDate")) %>%
      rename(Currency = NavCurrencyISO, `Net Asset` = TotalAum, VL = Nav, `Nb Shares` = NbShares) %>%
      relocate(Date, Currency, VL, `Nb Shares`, `Net Asset`)
    

    【讨论】:

    • 也可以这样获取数据框:data &lt;- read_json(api_url, simplifyVector = TRUE)
    • @Sal 谢谢 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-15
    • 2018-06-27
    相关资源
    最近更新 更多