如何解决使用 rvest 将单个高级类别链接到该类别中的多个项目
首先,如果这个问题的标题不清楚,我很抱歉 - 让我试着解释一下。我正在从 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 多个单独的节目/流派/概要)。
category <- df %>%
html_nodes("div.section__header") %>%
html_text()
但是,这仅返回大约 10 个类别,因此无法将其与其他值组合到一个表中。我想要的是一个还包括类别的决赛桌 - 例如如果第一个类别中有 10 个标题,并且该类别被称为“最受欢迎”,则在 category
列中应为所有 10 个标题显示“最受欢迎”。
希望一切都清楚了。如有必要,很乐意详细说明。
解决方法
您可以使用 purrr::map_dfr
将函数应用于每个 section
节点。在这种情况下,该函数将返回每个部分所需信息的 tibble
。 map_dfr
然后将这些小标题映射到最终的 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)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。