使用 rvest link 单个高级类别到该类别中的多个项目

Use rvest to link single high level categories to multiple items within that category

首先,如果这个问题的标题不清楚,我们深表歉意 - 让我试着解释一下。我正在从 www.bbc.co.uk/iplayer 抓取一些数据。该网站的结构大约有 10 个类别(例如体育、戏剧、现在流行),其中大约有 10 个节目。我已经设法抓取了我需要的大部分数据(节目名称、类型和概要),并且我知道如何将这些数据组合到一个新的数据框架中。到目前为止,这是我的代码:

df <- read_html("https://www.bbc.co.uk/iplayer")

title <- df %>%
    html_nodes("div.content-item__title.typo.typo--skylark.typo--bold") %>%
    html_text()
genre <- df %>%
    html_nodes("div.content-item__labels") %>%
    html_text()
synopsis <- df %>%
    html_nodes("div.content-item__info__primary") %>%
    html_text()

### Combine into a tabble/tibble ###
df2 <- tibble(title=title,
              genre=genre,
              synopsis=synopsis)

问题是“类别”存在于更高级别并且只有大约 10 个(而有 110 个左右的个人 programmes/genres/synopses)。

我知道获取类别的代码:

category <- df %>%
    html_nodes("div.section__header") %>%
    html_text()

但是,这只有 returns 大约 10 个类别,因此不能与其他值组合成 table。我想要的是最终的 table,其中还包括类别 - 例如如果第一个类别中有 10 个标题,并且该类别称为“最受欢迎”,那么在 category 列中应该为所有 10 个标题都显示“最受欢迎”。

希望一切都清楚。如有必要,很乐意详细说明。

您可以使用 purrr::map_dfr 将函数应用于每个 section 节点。该函数将 return 一个 tibble,在这种情况下,每个部分所需的信息。 map_dfr 然后会将这些 tibbles 映射到最终的 DataFrame。在 tibble 内,较短的 header 将被回收以匹配其他列的长度。

library(rvest)
library(purrr)
library(dplyr)

get_section_data <- function(section){
  
  t <- tibble(
    header = section %>% html_node('h2') %>% html_text(),
    title = section %>% html_nodes('.content-item__title') %>% html_text(),
    genre = section %>% html_nodes('.content-item__labels') %>% html_text(),
    synopsis = section %>% html_nodes('.content-item__info__primary') %>% html_text()
  )
  return(t)
}

page <- read_html('https://www.bbc.co.uk/iplayer')
sections <- page %>% html_nodes('.section__content')
results <- purrr::map_dfr(sections, get_section_data)