使用 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)
首先,如果这个问题的标题不清楚,我们深表歉意 - 让我试着解释一下。我正在从 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)